Javascript - 合并单个Object属性

时间:2015-08-31 19:03:48

标签: javascript object

假设我有一个像这样的Javascript对象:

var obj = {
    prop1: {
        subProp: [ 1 ]
    },
    prop2: {
        subProp2: [ 2 ]
    },
    prop3: {
        subProp: [ 3 ]
    }
}

正如您所看到的,我有一个多维对象,其中一些子属性是相同的。我想要的是合并这些子属性并将它们收集到一个新对象中,如下所示:

var obj2 = {
    subProp: [ 1, 3 ],
    subProp2: [ 2 ]
}

这是最好的方法吗?我不介意使用普通的Javascript或jQuery来做到这一点。

感谢您的任何提示或建议!

2 个答案:

答案 0 :(得分:2)

这似乎是一个非常具体的案例,它几乎肯定会更好地尝试并为此问题制定一般解决方案。但是,此代码可以满足您的需求。

function mergeSubProps(host, allowDuplicates) {
  var merged = {};

  // iterate over the keys of the outer object      
  Object.keys(host).forEach(function(outerKey) {
    var property = host[outerKey];

    // iterate over the keys of the inner object
    Object.keys(property).forEach(function(key) {

      // get the values of this key (assuming array)
      var values = property[key];
      merged[key] = merged[key] || [];

      if(!allowDuplicates) {
        // remove duplicates from the values array
        values = values.filter(function(value) {
          return merged[key].indexOf(value) < 0;
        });
      }

      // add these values to the object we're merging into
      merged[key] = merged[key].concat(values);
    });
  });

  return merged;
}

编辑:添加了第二个参数,允许/禁止最终合并数组中的重复值。如果省略第二个参数,它将默认为false,并且将排除重复项。

答案 1 :(得分:0)

可能不是性能最好的代码,但是这样......

// Merge subProp arrays
for (var prop in obj) {
    for (var subProp in obj[prop]) {
        obj2[subProp] = obj[prop][subProp].concat(obj2[subProp] || []);
    }
}

// Remove duplicates
for (var subProp in obj2) {
    obj2[subProp] = obj2[subProp].filter(function (item, pos) {
        return obj2[subProp].indexOf(item) == pos}
    );
}

如果使用LoDash或Underscore,那么代码就会少得多。