基于单独的数组将新属性添加到数组中的对象

时间:2014-04-15 18:59:25

标签: javascript jquery arrays underscore.js

我有两个包含对象的数组。我正在尝试根据原始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": "something@somewhere.com"
  },
  {
    "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": "something@somewhere.com",
    "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);

3 个答案:

答案 0 :(得分:1)

使用$.each()即可:

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

DOCUMENTATION

答案 1 :(得分:1)

您应该测试elem.column中是否存在该名称,您可以使用.indexOf函数来执行此操作。 .indexOf函数返回找到的对象的索引(从0开始),如果未找到它将返回-1。

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

FIDDLE

答案 2 :(得分: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
    }
  }
}