2015-06-10 5 views
0

У меня есть JSON, который я сейчас использую для диаграммы кендо-и. Мне нужно использовать данные для сетки, поэтому мне нужно разделить массив массивов вложенных массивов на собственный объект. Javascript или linq.js будут работать нормально. вот JSON, с которого я начинаю.Как перебрать массив объектов и отдельный вложенный массив массивов

customSeries = [{ 
"name": "Chantal Hamlet - Green Castle Homes", 
"subId": "10223", 
"bldId": "13551", 
"data": [ 
    [179900, 1386], 
    [214900, 1440], 
    [194500, 1496], 
    [217900, 1504], 
    [189900, 1542], 
    [184900, 1546], 
    [192500, 1570] 
], 

}, { 
"name": "Ella Sea Condos - Sahnow Construction", 
"subId": "9761", 
"bldId": "27380", 
"data": [ 
    [199900, 1500] 
] 
}, { 
"style": "smooth", 
"color": "blue", 
"data": [ 
    [20000, 200], 
    [40000, 400], 
    [40000, 400] 
], 
"name": "Subject Property" 
}] 

Мне нужно в итоге добавить 2 отдельных массива.

Первый массив

Array1 = [{ 
"name": "Chantal Hamlet - Green Castle Homes", 
"subId": "10223", 
"bldId": "13551" 

}, { 
    "name": "Ella Sea Condos - Sahnow Construction", 
    "subId": "9761", 
    "bldId": "27380" 
}, { 
"style": "smooth", 
"color": "blue", 
"name": "Subject Property" 
}] 

Второй массив

Array2 = [ 
{ 
    "data": [ 
     [179900, 1386], 
     [214900, 1440], 
     [194500, 1496], 
     [217900, 1504], 
     [189900, 1542], 
     [184900, 1546], 
     [192500, 1570] 
    ] 

}, { 
    "data": [ 
     [199900, 1500] 
    ] 
}, { 
    "data": [ 
     [20000, 200], 
     [40000, 400], 
     [40000, 400] 
    ] 
} 

]

ответ

2

Вы можете использовать метод Array.prototype.map.

var Array1 = customSeries.map(function(el) { 
    return { 
    name: el.name, 
    subId: el.subId, 
    bldId: el.bldId 
    }; 
}); 

var Array2 = customSeries.map(function(el) { 
    return { 
    data: el.data 
    }; 
}); 

Update:

Приведенный выше код не работает, когда ваши элементы customSeries не имеют фиксированных клавиш, кроме data.

Если вы используете lodash, вы можете сделать это:

var Array1 = customSeries.map(function(el) { 
    return _.omit(el, 'data'); 
}); 

var Array2 = customSeries.map(function(el) { 
    return _.pick(el, 'data'); 
}); 
+0

Закрыть, но последний элемент массива не имеет ключей 'subId' и' bldId'. –

+0

@RickHitchcock Да, не внимательно прочитал вопрос ... – xdazz

1

Вы можете посмотреть в использовании lodash, он имеет много хороших функций для манипулирования массивами и выполнения функций MapReduce ,

+0

Это будет работать. Знаете ли вы, что делать с помощью этой библиотеки – texas697

+0

К сожалению, вы не можете сделать домашнее задание для вас;) –

2

В зависимости от длины массива, вы можете сделать это в один проход. Использование linq.js здесь мало поможет, это просто добавит накладные расходы без реальной выгоды.

Если вы не возражаете уничтожить свои исходные данные, вы можете обрабатывать их оба одновременно, пройдя каждый из элементов и добавить копию массива data во второй массив при удалении данных из этого элемента.

var array1 = data, 
    array2 = []; 
array1.forEach(function (item) { 
    array2.push({ 
     data: item.data 
    }); 
    delete item.data; 
}); 

Если вы предпочитаете хранить исходные данные, вам придется клонировать каждый элемент при их обработке.

var array1 = [], 
    array2 = []; 
data.forEach(function (item) { 
    var noData = yourCloneMethod(item); // replace call with preferred clone method 
    delete noData.data; 
    array1.push(noData); 
    array2.push({ 
     data: item.data 
    }); 
}); 
Смежные вопросы