如何在javascript中遍历和比较数组元素内的对象

时间:2016-11-04 17:19:08

标签: javascript arrays data-structures functional-programming

给出以下数组结构:

[{ _id: '1234', characteristics: [[Object], [Object]]},
{ _id: '1234',characteristics: [[Object], [Object]]},
{ _id: '4567', characteristics: [[Object], [Object]]},
{ _id: '4567',characteristics: [ [Object], [Object]]},
{ _id: '4987',characteristics: [ [Object], [Object]]}]

如何将一个数组元素与下一个数组元素进行比较,并将该对象与相同的id合并?

最终结果类似于

[ { _id: '1234', characteristics: [ [Object], [Object] ,[Object], [Object] ]},
 { _id: '4567',characteristics: [ [Object], [Object] , [Object], [Object]]},
 { _id: '4987', characteristics: [ [Object], [Object] ] } ]

基本上id为1234的对象内的对象在特征下合并在一起。

过去2个小时我一直在盯着这个,有谁有任何想法?我更喜欢更实用的方法。

修改:我使用的解决方案基于Nenad Vracar的解决方案。

function mergeDupKey(data) {
    var o = {}
    return data.reduce(function(r, e) {
        if (!o[e._id]) {
            o[e._id] = e;
            r.push(o[e._id]);
        } else {
            o[e._id].characteristics = o[e._id].characteristics.concat(e.characteristics);
    }
    return r;
}, [])
}

var g = mergeDupKey(data)`

5 个答案:

答案 0 :(得分:2)

您可以将reduce()与一个辅助对象一起使用。您也可以使用concat()代替...push() like this

var data = [{ _id: '1234', characteristics: [[1], [2]]},
{ _id: '1234',characteristics: [[3], [4]]},
{ _id: '4567', characteristics: [[5], [6]]},
{ _id: '4567',characteristics: [ [7], [8]]},
{ _id: '4987',characteristics: [ [9], [10]]}];

var o = {}
var result = data.reduce(function(r, e) {
  if (!o[e._id]) {
    o[e._id] = e;
    r.push(o[e._id]);
  } else {
    o[e._id].characteristics.push(...e.characteristics);
  }
  return r;
}, [])

console.log(result)

答案 1 :(得分:1)

使用Array.prototype.reduce和哈希表对属性进行分组 - 请参阅下面的演示:



var array=[{_id:'1234',characteristics:[[1],[2]]},{_id:'1234',characteristics:[[3],[4]]},{_id:'4567',characteristics:[[5],[6]]},{_id:'4567',characteristics:[[7],[8]]},{_id:'4987',characteristics:[[9],[10]]}];

var result = array.reduce(function(hash) {
  return function(prev,curr){
    if(hash[curr._id]) {
      curr.characteristics.forEach(function(e){
        hash[curr._id].push(e);
      });
    } else {
      hash[curr._id] = curr.characteristics;
      prev.push({_id: curr._id, characteristics:hash[curr._id]})
    }
    return prev;
  };
}(Object.create(null)), []);

console.log(result);

.as-console-wrapper{top:0;max-height:100%!important;}




答案 2 :(得分:0)

可以使用.reduce()完成此操作。不需要辅助对象。

var data = [{ _id: '1234', characteristics: [[1], [2]]},
{ _id: '1234',characteristics: [[3], [4]]},
{ _id: '4567', characteristics: [[5], [6]]},
{ _id: '4567',characteristics: [ [7], [8]]},
{ _id: '4987',characteristics: [ [9], [10]]}];

var found = false;
var result = data.reduce(function(prev, curr) {
  prev.forEach(function(obj) {
    if (obj._id == curr._id) {
      obj.characteristics = obj.characteristics.concat(curr.characteristics);
      found = true;
    }
  });
  if (!found)
    prev.push(curr);
  found = false;
  return prev;
}, []);

console.log(result)

答案 3 :(得分:0)

使用ES5方法:

var lst = [{ _id: '1234', characteristics: [[Object], [Object]]},
{ _id: '1234',characteristics: [[Object], [Object]]},
{ _id: '4567', characteristics: [[Object], [Object]]},
{ _id: '4567',characteristics: [ [Object], [Object]]},
{ _id: '4987',characteristics: [ [Object], [Object]]}];

var result = [];

var findById = function(id) {
    for (var i = 0; i < result.length; i++) {
        var item = result[i];
        if (item._id === id) {
            return item;
        }
    }
    var newitem = { _id: id, characteristics: [] };
    result.push(newitem);
    return newitem;
}

lst.forEach(function(item) {
    var aux = findById(item._id);
    aux.characteristics.concat(item.characteristics);
});

console.log(result);

使用ES6:

var lst = [{ _id: '1234', characteristics: [[Object], [Object]]},
{ _id: '1234',characteristics: [[Object], [Object]]},
{ _id: '4567', characteristics: [[Object], [Object]]},
{ _id: '4567',characteristics: [ [Object], [Object]]},
{ _id: '4987',characteristics: [ [Object], [Object]]}];

var result = [];

lst.forEach(item => {
    var aux = result.find(it => it._id === item._id);
    if (!aux) {
        aux = { _id: item._id, characteristics: [] };
        result.push(aux);
    }
    aux.characteristics.concat(item.characteristics);
});

console.log(result);

答案 4 :(得分:0)

您可以执行以下操作;

&#13;
&#13;
var data = [{ _id: '1234', characteristics: [["whatever"], ["whatever"]]},
            { _id: '1234', characteristics: [["whatever"], ["whatever"]]},
            { _id: '4567', characteristics: [["whatever"], ["whatever"]]},
            { _id: '4567', characteristics: [["whatever"], ["whatever"]]},
            { _id: '4987', characteristics: [["whatever"], ["whatever"]]}],
     lut = data.reduce((p,c) => p[c._id] ? (p[c._id].characteristics.push(...c.characteristics),p)
                                         : (p[c._id] = c, p), {});
  result = Object.keys(lut)
                 .map(k => lut[k]);
console.log(result);
&#13;
&#13;
&#13;