Добавить новое свойство к объектам в массиве на основе отдельного массива

0

У меня есть 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);
  • 0
    Я бы преобразовал configArray в объект, ключи которого - столбцы, а значения - цели. Затем вы можете просто orgArray и добавить цель, когда она существует, вместо того, чтобы каждый раз проходить по массиву columns .
Теги:
arrays
underscore.js

3 ответа

1
Лучший ответ

Используя $.each() вы можете:

$.each(orgArray, function(i, org){
  $.each(configArray, function(j, config){
      if(config.columns.indexOf(org.name) > -1){
          orgArray[i].target = config.target;
      }
  });
});

ДОКУМЕНТАЦИЯ

  • 1
    Спасибо! Я думаю, что я терял след, где я был с вложенными eaches, и мне просто было трудно обдумать это.
1

Вы должны проверить, существует ли имя в elem.column, вы можете сделать это, используя функцию .indexOf. Функция.indexOf возвращает индекс найденного объекта (начиная с 0), если он не найден, он вернет -1.

if(elem.columns.indexOf(element.name) > -1)

FIDDLE

  • 0
    Спасибо за совет!
0

Что-то подчеркивающее, не уверен (не подтвердилось), должно работать. Скопируйте массив и сопоставьте его с обновленным в зависимости от вашего состояния.

var newArray = orgArray;
_.map(newArray, function(elem){
  _.each(configArray, function(elem_config, i) {
    if(_.contains(elem_config, newArray.name)){
      return newArray['target'] = elemconfig.target
    }
  }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню