如何根据对象的值对对象数组进行分组排序?

时间:2020-08-20 11:36:52

标签: javascript arrays

我有这样的对象数组:

var points = [{a: 4, b: 3, c:'parent'}, {a: 1, b:5, c:'child'}, {a: 5, b: 2, c:'child'}, {a: 1, b: 2, c:'parent'}, {a: 3, b: 1, c:'child'}];

我需要对“ a”对象的值进行排序。但是问题在于,如果它具有“ c”对象的值“ parent”,则“ c”对象的值“ child”应该是该对象的下一个对象,并且不应进行排序。

最后我希望有这个排序的点数组:

var sortedPoints = [{a: 1, b: 2, c:'parent'}, {a: 3, b: 1, c:'child'} ,{a: 4, b: 3, c:'parent'}, {a: 1, b:5, c:'child'}, {a: 5, b: 2, c:'child'}];

1 个答案:

答案 0 :(得分:1)

您需要将父母和孩子分组,排序并获得一个平面数组。

var points = [{ a: 4, b: 3, c: 'parent' }, { a: 1, b: 5, c: 'child' }, { a: 5, b: 2, c: 'child' }, { a: 1, b: 2, c: 'parent' }, { a: 3, b: 1, c: 'child' }],
    sorted = points
        .reduce((r, o) => {
            if (o.c === 'parent') r.push([o]);
            else r[r.length - 1].push(o);
            return r;
        }, [])
        .sort(([{ a }], [{ a: b }]) => a - b)
        .flat();

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