我有一个这样的数组,如果连续状态相同,我想合并对象。
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 }
]
答案 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);