首页 > 解决方案 > 在循环中使用逻辑或运算符对数组进行排序

问题描述

我有一个这样的数组:

var planets_info = [
    {
    "name": "Mercury",
    "size": 120,
    "color": "gray",
  },
  {
    "name": "Earth",
    "size": 100,
    "color": "blue",
  },
  {
    "name": "Mars",
    "size": 200,
    "color": "red",
  }
];

我正在尝试根据名称和大小或颜色进行排序。这是这样定义的:

var sorts = "size,name"; // or size, name, color dynamic value

我可以这样排序:

planets_info = planets_info.sort( function(a, b){
        return a.size - b.size || a.color - b.color;
        //  or
        // return a.size - b.size || a.color - b.color || a.name - b.name;

        //  or
        // a.color - b.color || a.name - b.name;

});

但我不知道如何修改排序,以便它根据来自的值进行排序var sorts- 因此 a.size - b.size || a.color - b.color;将根据来自的值动态sorts- 它可以基于name,sizename,size,color将添加||

var sorts = "size,name";
sorts = sorts.split(',');

sorts.forEach(element=> {
    console.log("sort " + element);
});

标签: javascriptsorting

解决方案


您可以使用所需键的数组进行排序,并使用短路来比较值。

const
    planets = [{ name: "Mercury", size: 120, color: "gray" }, { name: "Earth", size: 100, color: "blue" }, { name: "Mars", size: 200, color: "red" }],
    sorts = ["size", "name"];

planets.sort((a, b) => {
    let v;
    sorts.some(k => v = a[k] > b[k] || -(a[k] < b[k]));
    return v;
});

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


推荐阅读