Javascript-合并单个对象属性

Javascript-合并单个对象属性,javascript,object,Javascript,Object,假设我有一个Javascript对象,如下所示: var obj = { prop1: { subProp: [ 1 ] }, prop2: { subProp2: [ 2 ] }, prop3: { subProp: [ 3 ] } } 正如你所看到的,我有一个多维对象,它有一些相等的子对象。我想要的是合并这些子属性并将它们收集到一个新对象中,如下所示: var obj2 = { subP

假设我有一个Javascript对象,如下所示:

var obj = {
    prop1: {
        subProp: [ 1 ]
    },
    prop2: {
        subProp2: [ 2 ]
    },
    prop3: {
        subProp: [ 3 ]
    }
}
正如你所看到的,我有一个多维对象,它有一些相等的子对象。我想要的是合并这些子属性并将它们收集到一个新对象中,如下所示:

var obj2 = {
    subProp: [ 1, 3 ],
    subProp2: [ 2 ]
}
哪种方法最好?我不介意使用普通Javascript或jQuery来实现这一点


谢谢你的任何提示或建议

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

// 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或下划线,代码会少得多。

这似乎是一个非常特殊的情况,几乎可以肯定,最好尝试开发一个通用的问题解决方案。但是,此代码不满足您的要求

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,并且将排除重复的参数

属性是否总是一个你试图合并在一起的数字数组?@AnthonyForloney是的!子属性需要合并在一起,即,如果有10个子属性命名为subop,则新对象应该只有一个子属性,并且合并所有值。在这种情况下,值总是一个数字数组。太棒了!这本书非常优雅,可读性强,几乎完美无瑕。一个小问题:是否可以合并子属性中的数字数组?这样,我们就没有类似subpop:[1,3,1,2]的东西,只有subpop:[1,3,2]。@DiegodeOliveira正在合并子属性中的数字数组,就像确保没有重复条目一样?我不确定我是否完全理解?太美了!谢谢这正是我要找的!