我只是想知道是否有人可以帮助我。我有一个包含对象的数组列表,每个对象包含一个组号和一个日期。我想要做的是创建一个新的数组,每个组号只包含一个条目。该唯一条目应该是该组中最新的对象(使用日期值)。
例如,完整数组可以是:
var objectArray [
{
groupNumber: '1'
date: '01/01/2016'
},
{
groupNumber: '2'
date: '02/01/2016'
},
{
groupNumber: '3'
date: '03/01/2016'
},
{
groupNumber: '2'
date: '04/01/2016'
},
{
groupNumber: '3'
date: '05/01/2016'
},
{
groupNumber: '4'
date: '06/01/2016'
},
{
groupNumber: '5'
date: '07/01/2016'
},
{
groupNumber: '2'
date: '08/01/2016'
},
{
groupNumber: '2'
date: '09/01/2016'
},
]
但是新阵列的出现应该是:
[
{
groupNumber: '1'
date: '01/01/2016'
},
{
groupNumber: '2'
date: '09/01/2016'
},
{
groupNumber: '3'
date: '05/01/2016'
},
{
groupNumber: '4'
date: '06/01/2016'
},
{
groupNumber: '5'
date: '07/01/2016'
},
]
这是否可行,如果可行,最有效的方法是什么?我正在使用角度,但如果可能的话,我不想带任何额外的库。
感谢。
答案 0 :(得分:2)
如果找到更新的日期,您可以使用哈希表和Array#reduce
进行交换。
此提案适用于未分类的数据。
var objectArray = [{ groupNumber: '1', date: '01/01/2016' }, { groupNumber: '2', date: '02/01/2016' }, { groupNumber: '3', date: '03/01/2016' }, { groupNumber: '2', date: '04/01/2016' }, { groupNumber: '3', date: '05/01/2016' }, { groupNumber: '4', date: '06/01/2016' }, { groupNumber: '5', date: '07/01/2016' }, { groupNumber: '2', date: '08/01/2016' }, { groupNumber: '2', date: '09/01/2016' }],
hash = Object.create(null),
result = objectArray.reduce(function (r, a) {
if (!(a.groupNumber in hash)) {
hash[a.groupNumber] = r.push(a) - 1;
return r;
}
if ((new Date(r[hash[a.groupNumber]].date)) < (new Date(a.date))) {
r[hash[a.groupNumber]] = a;
}
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
我提出了一个三阶段算法:
1 /对groupNumber上的数组进行排序,使相同groupNumber的元素成为adj
2 /只保留按groupNumber分组的元素,这是最年轻的
3 /最后添加排序数组的最后一个元素,因为它将匹配
var objectArray = [{ groupNumber: '1', date: '01/01/2016' }, { groupNumber: '2', date: '02/01/2016' }, { groupNumber: '3', date: '03/01/2016' }, { groupNumber: '2', date: '04/01/2016' }, { groupNumber: '3', date: '05/01/2016' }, { groupNumber: '4', date: '06/01/2016' }, { groupNumber: '5', date: '07/01/2016' }, { groupNumber: '2', date: '08/01/2016' }, { groupNumber: '2', date: '09/01/2016' }];
var results = [];
var sortedArray = objectArray.sort((a,b) => a.groupNumber - b.groupNumber);
sortedArray.forEach((x,i,arr) => {
if (i < arr.length-1 && x.groupNumber !== arr[i+1].groupNumber) results.push(x);
});
results = results.concat(sortedArray.slice(-1));
console.log(results);
&#13;
答案 2 :(得分:1)
有人可能会这样做;
var arr = [
{
groupNumber: '1',
date: '01/01/2016'
},
{
groupNumber: '2',
date: '02/01/2016'
},
{
groupNumber: '3',
date: '03/01/2016'
},
{
groupNumber: '2',
date: '04/01/2016'
},
{
groupNumber: '3',
date: '05/01/2016'
},
{
groupNumber: '4',
date: '06/01/2016'
},
{
groupNumber: '5',
date: '07/01/2016'
},
{
groupNumber: '2',
date: '08/01/2016'
},
{
groupNumber: '2',
date: '09/01/2016'
}
],
res = [...arr.reduce((m,c) => { var o = m.get(c.groupNumber);
return o ? Date(o.date) > Date(c.date) ? m
: m.set(o.groupNumber,c)
: m.set(c.groupNumber,c);
}, new Map())
.values()];
console.log(res);