按属性值

For by property value

本文关键字:属性      更新时间:2023-09-26

我有一个类似的数组

var myArray = [
    {name: 'A', y: 10}, 
    {name: 'B', y: 20},
    {name: 'C', y: 5}
];

是否可以对数组进行排序并保留原始索引?

示例:

按y属性显示数组:

'C',"A",'B'

按索引显示数组:

"A",'B','C'

我希望你能帮助我。谢谢你的阅读。

您可以映射数组以保留数组对象中的索引:

var myArray = [
    {name: 'A', y: 10}, 
    {name: 'B', y: 20},
    {name: 'C', y: 5}
];
myArray = myArray.map(function(item, index) {
    item.index = index;
    return item;
});

然后排序:

myArray.sort(function(i1, i2) {
    return i1.index > i2.index;
});
myArray.sort(function(i1, i2) {
    return i1.y > i2.y;
});

您可以编写一个函数来按属性排序:

var sortBy = function(prop){
  return function(el1, el2){
    return el1[prop]>el2[prop];
  };
};

则可以使用myArray.sort(sortBy('y'))按数组的属性y排序,或使用myArray.sort(sortBy('name'))name排序。您可以使用原始数组通过索引进行访问。或者你可以像madox2所说的那样添加一个名为index的新属性。

在负责排序类型的函数中使用map进行排序。返回一个新数组,其中包含对原始对象的引用。

function sort(array, key, isString) {
    return array.map(function (_, i) { return i; }).sort(
        isString ?
            function (a, b) { return array[a][key].localeCompare(array[b][key]); } :
            function (a, b) { return array[a][key] - array[b][key]; }
    ).map(function (i) { return array[i]; });
}
var myArray = [
        { name: 'B', y: 20 },
        { name: 'C', y: 5 },
        { name: 'A', y: 10 }
    ];
document.write('<pre>sort by name: ' + JSON.stringify(sort(myArray, 'name', true), 0, 4) + '</pre>');
document.write('<pre>sort by y: ' + JSON.stringify(sort(myArray, 'y'), 0, 4) + '</pre>');
document.write('<pre>original array: ' + JSON.stringify(myArray, 0, 4) + '</pre>');