【问题标题】:javascript - Sort objects array by key of object property [duplicate]javascript - 按对象属性的键对对象数组进行排序[重复]
【发布时间】:2017-05-31 19:25:34
【问题描述】:

我有一组看起来像这样的对象:

var array = [{
key: {name: "C Some name", id: 123},
value: {value: 1, element:"some element"}
}, {
key: {name: "A Name 2", id: 1234},
value: {value: 4, element:"some element 2"}
}, {
key: {name: "B Other name", id: 1235},
value: {value: 2, element:"some element 3"}
}] 

我想按名称(在键对象内部)和值(在值对象内部)对这个数组进行排序。 按名称排序的结果应该返回这个结果:

[{
key: {name: "A Name 2", id: 1234},
value: {value: 4, element:"some element 2"}
}, {
key: {name: "B Other name", id: 1235},
value: {value: 2, element:"some element 3"}
}, {
key: {name: "C Some name", id: 123},
value: {value: 1, element:"some element"}
}]

按值排序的结果应该是这样的:

[{  key: {name: "C Some name", id: 123},
    value: {value: 1, element:"some element"}
}, {
key: {name: "B Other name", id: 1235},
    value: {value: 2, element:"some element 3"}
}, {
key: {name: "A Name 2", id: 1234},
    value: {value: 4, element:"some element 2"}
}]

我试过按名称排序:

array.sort(a,b){
return a.key["name"] - b.key["name"];
}

这是按值排序:

array.sort(a,b){
return a.key["value"] - b.key["value"];
}

但它不起作用。如何对这个数组进行排序?

【问题讨论】:

  • a.key[name] 表示您有一些名为 name 的变量,并且您希望使用匹配的名称访问 a.key 的属性。您是否尝试过a.key.name 以获得正确的值?
  • 我应该在我的问题中设置 a.key["name"] 什么等于 a.key.name

标签: javascript arrays sorting


【解决方案1】:

其中一种方法是这样的。

基本上,使用箭头函数进行排序回调,然后使用localeCompare比较两个string
first.key.name.localeCompare(second.key.name)

对于整数值,您可以通过减法直接比较它们。
first.value.value - second.value.value

重要的是要知道 comparer 函数对ab 两个值的工作原理。

  • 小于 0:将a 排序为低于b 的索引。

  • 零:ab 应被视为相等,并且不执行排序。

  • 大于 0:将b 排序为低于a 的索引

var array = [{
key: {name: "C Some name", id: 123},
value: {value: 1, element:"some element"}
}, {
key: {name: "A Name 2", id: 1234},
value: {value: 4, element:"some element 2"}
}, {
key: {name: "B Other name", id: 1235},
value: {value: 2, element:"some element 3"}
}] 

var resultSortedByName = array.sort( (first,second) => {return first.key.name.localeCompare(second.key.name)} );
console.log(resultSortedByName);

var resultSortedByValue = array.sort( (first,second) => {return (first.value.value - second.value.value)} );
console.log(resultSortedByValue);

【讨论】:

    【解决方案2】:

    您应该将字符串与> 进行比较。

    var array = [{
        key: {name: "C Some name", id: 123},
        value: {value: 1, element:"some element"}
    }, {
        key: {name: "A Name 2", id: 1234},
        value: {value: 4, element:"some element 2"}
    }, {
        key: {name: "B Other name", id: 1235},
        value: {value: 2, element:"some element 3"}
    }];
    
    var newArray = array.sort(function(first, second) {
        var a = first.key.name;
        var b = second.key.name;
        
        if(a > b) {
            return 1;
        } else if(a < b) {
            return -1;
        } else {
            return 0;
        }
    });
    
    console.log(newArray);

    【讨论】:

    • 为什么投反对票?
    • 对版主应有的尊重,有时节制是过度的!