将对象数组精简到最新的组中

时间:2016-11-08 16:20:44

标签: javascript angularjs arrays

我只是想知道是否有人可以帮助我。我有一个包含对象的数组列表,每个对象包含一个组号和一个日期。我想要做的是创建一个新的数组,每个组号只包含一个条目。该唯一条目应该是该组中最新的对象(使用日期值)。

例如,完整数组可以是:

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'
    },
]

这是否可行,如果可行,最有效的方法是什么?我正在使用角度,但如果可能的话,我不想带任何额外的库。

感谢。

3 个答案:

答案 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 /最后添加排序数组的最后一个元素,因为它将匹配

&#13;
&#13;
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;
&#13;
&#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);