合并数组中的对象

时间:2016-07-26 04:24:06

标签: javascript arrays

我有一个这样的数组,如果连续状态相同,我想合并对象。

InputArray

[ {"state" : "A", "st" : 12, "et" : 14 },
  {"state" : "A", "st" : 14, "et" : 16 },
  {"state" : "B", "st" : 20, "et" : 94 },
  {"state" : "B", "st" : 94, "et" : 104 }
]

预期输出(此处st将是第一个对象连续对象,et将是最后一个连续对象):

[ {"state" : "A", "st" : 12, "et" : 16 },
  {"state" : "B", "st" : 20, "et" : 104 }
]

3 个答案:

答案 0 :(得分:0)

我不确定。但如果您尝试在javascript上实现此功能,请尝试使用此Jsfiddle here

function remove_duplicates(objectsArray) {
    var usedObjects = [];

    for (var i=objectsArray.length - 1;i>=0;i--) {
        var newRecord = true;
        for (var j=usedObjects.length - 1;j>=0;j--) {
             if (usedObjects[j].state == objectsArray[i].state) {
                    newRecord = false;
                break;
             }         
        }
        if (newRecord) {
            usedObjects.push(objectsArray[i]);   
        }
    }

    return usedObjects;

}

var objectsArray = [{"state" : "A", "st" : 12, "et" : 14 },
  {"state" : "A", "st" : 14, "et" : 16 },
  {"state" : "B", "st" : 20, "et" : 94 },
  {"state" : "B", "st" : 94, "et" : 104 }];
var clean = remove_duplicates(objectsArray);

console.log(clean);

答案 1 :(得分:0)

按州分组,然后将每个组转换为具有所需字段的对象:

function merge(input) {
  const groups = groupBy(input, function(elt) { return elt.state; });

  const states = Object.keys(groups);
  const result = [];

  for (i = 0; i < states.length; i++) {
    const group = groups[state];
    result.push({
      state: group[0].state,
      st: group[0].st,
      et: group[group.length - 1].et
    });
  }

  return result;
}

写作groupBy留作练习。或者,您可以使用下划线_.groupBy。它需要一个数组和一个指定分组条件的函数,并返回一个对象,其键是组名,值是属于该组的所有元素的数组。

然后上面的代码循环遍历groups对象中的每个属性,并且对于每个属性,将一个对象从组的第一个成员和st中取出et推送到结果数组中。从最后一次开始。

如果您使用的是Underscore,则可以通过在对象上使用_.map来简化操作:

function merge(input) {
  return _.map(_.groupBy(input, 'state'), (key, items) => ({
    state: key,
    st: items[0].st,
    et: items[items.length - 1].et
  }));
}

答案 2 :(得分:0)

可能你可以这样做;

var arr = [ {"state" : "A", "st" : 12, "et" : 14 },
            {"state" : "A", "st" : 14, "et" : 16 },
            {"state" : "B", "st" : 20, "et" : 94 },
            {"state" : "B", "st" : 94, "et" : 104 },
            {"state" : "C", "st" : 37, "et" : 42 }
          ],
reduced = arr.reduceRight((p,c,i,a) => { p.state == c.state ? (p.st = c.st, a.splice(i,1))
                                                            : p = c;
                                         return p;
                                       });
console.log(arr);