按属性排序对象,具有该属性的数组

时间:2017-09-07 09:24:35

标签: javascript arrays sorting

我需要通过" ID"来订购一系列对象。属性,数组看起来像这样:

var data = [
    {
        id: 1,
        name: "Test"
    },
    {
        id: 2,
        name: "Another test"
    },
    {
        id: 3,
        name: "Third test"
    }
];

和'排序'数组看起来像这样:

var sortingArray = [2,3,1];

如何通过排序数组对对象数组进行排序?

4 个答案:

答案 0 :(得分:0)

您需要一个小功能,例如:

function sortByKey(array, key) 
{
    return array.sort(function(a, b) {
        let x = a[key]; var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
}

并使用它:

let sorted = sortByKey(data, "id");

答案 1 :(得分:0)

json

答案 2 :(得分:0)

您可以使用array#reducearray#filter

&#13;
&#13;
const data = [{id: 1,name: "Test"},{id: 2,name: "Another test"},{id: 3,name: "Third test"}], 
      sortingArray = [2,3,1];

var result = sortingArray.reduce((res, n) => {
  let temp = data.filter(o => o.id === n);
  return res.concat(temp);
},[]);

console.log(result);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

当处理这样的列表时,我通常会有一张地图,我可以通过ID获取项目;快速访问。

快速版本将是:

var data = [
    {
        id: 1,
        name: "Test"
    },
    {
        id: 2,
        name: "Another test"
    },
    {
        id: 3,
        name: "Third test"
    }
];
var dataById = data.reduce((acc, item) => (acc[item.id] = item, acc), Object.create(null));

//and now using it

var sortingArray = [2,3,1];

var result = sortingArray.map(id => dataById[id]);
console.log(result);
.as-console-wrapper{top:0;max-height:100%!important}

这方面的缺点是数组和地图需要保持同步。因此,您对Array 所做的每次更新(如添加,删除或替换对象)都需要对地图进行更新。修改对象很好(除非你修改ID,你永远不应该这样做)

如果列表上有很多波动,我会将它包装在一个为我处理此同步的对象中