У меня есть 2 массива с объектами в них. Я пытаюсь создать новый массив на основе информации, представленной в исходных 2 массивах. У меня есть jQuery и Underscore.
2 массива выглядят следующим образом:
var orgArray = [
{
"name": "phone",
"value": "123-456-7890"
},
{
"name": "color",
"value": "blue"
},
{
"name": "city",
"value": "San Diego"
},
{
"name": "zip",
"value": "54321"
},
{
"name": "email",
"value": "[email protected]"
},
{
"name": "state",
"value": "CA"
},
{
"name": "Sale",
"value": "On Sale"
}
];
var configArray = [
{
"columns": ["phone", "city", "zip"],
"target": "phone"
},
{
"columns": ["email", "state"],
"target": "email"
}
];
Если configArray[i].columns
содержит строку, которая находится в orgArray[i].name
затем добавить target
свойство объекта orgArray. Вот новый массив, который я пытаюсь создать:
var newArray = [
{
"name": "phone",
"value": "123-456-7890",
"target": "phone"
},
{
"name": "color",
"value": "blue"
},
{
"name": "city",
"value": "San Diego",
"target": "phone"
},
{
"name": "zip",
"value": "54321",
"target": "phone"
},
{
"name": "email",
"value": "[email protected]",
"target": "email"
},
{
"name": "state",
"value": "CA",
"target": "email"
},
{
"name": "Sale",
"value": "On Sale"
}
];
Вот мой текущий JS и скрипка:
jsFiddle: http://jsfiddle.net/9Dv2f/
var newArray = [];
_.each(orgArray, function(element, index, list) {
_.each(configArray, function(elem, i) {
_.each(elem.columns, function (el, x) {
if (element.name === el.name) {
console.log(element.name);
newArray.push({
name: element.name,
value: element.value,
target: elem.target
});
}
});
});
});
console.log(newArray);
Используя $.each()
вы можете:
$.each(orgArray, function(i, org){
$.each(configArray, function(j, config){
if(config.columns.indexOf(org.name) > -1){
orgArray[i].target = config.target;
}
});
});
Вы должны проверить, существует ли имя в elem.column, вы можете сделать это, используя функцию .indexOf. Функция.indexOf возвращает индекс найденного объекта (начиная с 0), если он не найден, он вернет -1.
if(elem.columns.indexOf(element.name) > -1)
Что-то подчеркивающее, не уверен (не подтвердилось), должно работать. Скопируйте массив и сопоставьте его с обновленным в зависимости от вашего состояния.
var newArray = orgArray;
_.map(newArray, function(elem){
_.each(configArray, function(elem_config, i) {
if(_.contains(elem_config, newArray.name)){
return newArray['target'] = elemconfig.target
}
}
}
configArray
в объект, ключи которого - столбцы, а значения - цели. Затем вы можете простоorgArray
и добавить цель, когда она существует, вместо того, чтобы каждый раз проходить по массивуcolumns
.