按属性数组对对象数组进行排序

时间:2019-12-17 13:27:01

标签: javascript arrays sorting

我得到了一个像这样的对象数组:

var SkillBuddys = [
    {
        Property1: "1",
        Property2: "Test",
        Property3: "Data",
        Property4: [{},{},{}],
    }, {
        Property1: "2",
        Property2: "Test2",
        Property3: "Data2"
    }, {
        Property1: "3",
        Property2: "Test3",
        Property3: "Data3",
        Property4: [{},{}],
    }, {
        Property1: "4",
        Property2: "Test4",
        Property3: "Data4"
    }, {
        Property1: "5",
        Property2: "Test5",
        Property3: "Data5",
        Property4: [{}],
    }
];

我想使用属性4上的javaScript对其进行排序,因此如果对象具有属性4并包含一个数组。像这样:

var SkillBuddys = [
    {
        Property1: "1",
        Property2: "Test",
        Property3: "Data",
        Property4: [{},{},{}],
    }, {
        Property1: "3",
        Property2: "Test3",
        Property3: "Data3",
        Property4: [{},{}],
    }, {
        Property1: "5",
        Property2: "Test5",
        Property3: "Data5",
        Property4: [{}],
    }, {
        Property1: "2",
        Property2: "Test2",
        Property3: "Data2"
    }, {
        Property1: "4",
        Property2: "Test4",
        Property3: "Data4"
    }
];

如果属性4不存在,则返回“未定义”。如何使用Array.Sort对此进行排序?

3 个答案:

答案 0 :(得分:3)

您可以使用sort属性和length运算符来||数组。

var array = [ { Property1: "1", Property2: "Test", Property3: "Data", Property4: [{},{},{}], }, { Property1: "2", Property2: "Test2", Property3: "Data2" }, { Property1: "3", Property2: "Test3", Property3: "Data3", Property4: [{},{}], }, { Property1: "4", Property2: "Test4", Property3: "Data4" }, { Property1: "5", Property2: "Test5", Property3: "Data5", Property4: [{}], } ];

array.sort((a, b) => (b['Property4'] || []).length - (a['Property4'] || []).length);

console.log(array);

答案 1 :(得分:2)

一种方法可能是进行分解,然后在属性不存在时使用默认数组。然后,您可以.sort()通过数组长度的差异:

const skillBuddys = [ { Property1: "1", Property2: "Test", Property3: "Data", Property4: [{},{},{}], }, { Property1: "2", Property2: "Test2", Property3: "Data2" }, { Property1: "3", Property2: "Test3", Property3: "Data3", Property4: [{},{}], }, { Property1: "4", Property2: "Test4", Property3: "Data4" }, { Property1: "5", Property2: "Test5", Property3: "Data5", Property4: [{}], } ];

const res = skillBuddys.sort(
  ({Property4: a = []}, {Property4: b = []}) => b.length - a.length
);

console.log(res);

答案 2 :(得分:1)

SkillBuddys
.filter((x) => Array.isArray(x.Property4)  )
.sort( (a,b) => b.Property4.length - a.Property4.length)
.concat( SkillBuddys.filter((x) => !Array.isArray(x.Property4))

这将为您提供一个数组,其中具有Property4的元素按内部数组的长度排序,之后其余元素没有指定的顺序(您可以使用选择的顺序来传递sort())< / p>