我有一个对象列表,我希望基于类型字符串的字段attr进行排序。我试着用

list.sort(function (a, b) {
    return a.attr - b.attr
})

但发现-似乎不适用于JavaScript中的字符串。我如何能排序基于类型字符串的属性的对象列表?


当前回答

答案(现代ECMAScript)

list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr))

Or

list.sort((a, b) => +(a.attr > b.attr) || -(a.attr < b.attr))

描述

将一个布尔值转换为一个数字会产生以下结果:

True -> 1 .单击“确定” False -> 0

考虑三种可能的模式:

X大于y: (X > y) - (y < X) -> 1 - 0 -> 1 X等于y:(X > y) - (y < X) -> 0 - 0 -> 0 X小于y:(X > y) - (y < X) -> 0 -1 -> -1

(替代)

x比y: + (x > y) | | - - - - - - (x < y) - > 1 | | 0 - > 1 x等于y: + (x > y) | | - - - - - - (x < y) - > 0 | | 0 - > 0 x小于y: + (x > y) | | - - - - - - (x < y) - > 0 | | 1 - > 1

这些逻辑等价于典型的排序比较器函数。

if (x == y) {
    return 0;
}
return x > y ? 1 : -1;

其他回答

在javascript中,我们使用.localCompare方法对字符串进行排序

为打印稿

const data = ["jane", "mike", "salome", "ababus", "buisa", "dennis"];

const sort = (arr: string[], mode?: 'desc' | 'asc') => 
  !mode || mode === "asc"
    ? arr.sort((a, b) => a.localeCompare(b))
    : arr.sort((a, b) => b.localeCompare(a));


console.log(sort(data, 'desc'));// [ 'salome', 'mike', 'jane', 'dennis', 'buisa', 'ababus' ]
console.log(sort(data, 'asc')); // [ 'ababus', 'buisa', 'dennis', 'jane', 'mike', 'salome' ]


对JS

const data = ["jane", "mike", "salome", "ababus", "buisa", "dennis"];

/**
 * @param {string[]} arr
 * @param {"asc"|"desc"} mode
 */
const sort = (arr, mode = "asc") =>
  !mode || mode === "asc"
    ? arr.sort((a, b) => a.localeCompare(b))
    : arr.sort((a, b) => b.localeCompare(a));

console.log(sort(data, 'desc'));// [ 'salome', 'mike', 'jane', 'dennis', 'buisa', 'ababus' ]
console.log(sort(data, 'asc')); // [ 'ababus', 'buisa', 'dennis', 'jane', 'mike', 'salome' ]

答案(现代ECMAScript)

list.sort((a, b) => (a.attr > b.attr) - (a.attr < b.attr))

Or

list.sort((a, b) => +(a.attr > b.attr) || -(a.attr < b.attr))

描述

将一个布尔值转换为一个数字会产生以下结果:

True -> 1 .单击“确定” False -> 0

考虑三种可能的模式:

X大于y: (X > y) - (y < X) -> 1 - 0 -> 1 X等于y:(X > y) - (y < X) -> 0 - 0 -> 0 X小于y:(X > y) - (y < X) -> 0 -1 -> -1

(替代)

x比y: + (x > y) | | - - - - - - (x < y) - > 1 | | 0 - > 1 x等于y: + (x > y) | | - - - - - - (x < y) - > 0 | | 0 - > 0 x小于y: + (x > y) | | - - - - - - (x < y) - > 0 | | 1 - > 1

这些逻辑等价于典型的排序比较器函数。

if (x == y) {
    return 0;
}
return x > y ? 1 : -1;

因为在javascript中可以直接比较字符串,所以这样做就可以了

list.sort(function (a, b) {
    return a.attr < b.attr ? -1: 1;
})

这比使用更有效率

  return a.attr > b.attr ? 1: -1;

因为如果元素具有相同的attr (a.t attr == b.t attr),排序函数将毫无理由地交换两者。

例如

  var so1 = function (a, b) { return a.atr > b.atr ? 1: -1; };
  var so2 = function (a, b) { return a.atr < b.atr ? -1: 1; }; // better

  var m1 = [ { atr: 40, s: "FIRST" }, { atr: 100, s: "LAST" }, { atr: 40, s: "SECOND" } ].sort (so1);
  var m2 = [ { atr: 40, s: "FIRST" }, { atr: 100, s: "LAST" }, { atr: 40, s: "SECOND" } ].sort (so2);
  
  // m1 sorted but ...:  40 SECOND  40 FIRST   100 LAST   
  // m2 more efficient:  40 FIRST   40 SECOND  100 LAST
<!doctype html>
<html>
<body>
<p id = "myString">zyxtspqnmdba</p>
<p id = "orderedString"></p>
<script>
var myString = document.getElementById("myString").innerHTML;
orderString(myString);
function orderString(str) {
    var i = 0;
    var myArray = str.split("");
    while (i < str.length){
        var j = i + 1;
        while (j < str.length) {
            if (myArray[j] < myArray[i]){
                var temp = myArray[i];
                myArray[i] = myArray[j];
                myArray[j] = temp;
            }
            j++;
        }
        i++;
    }
    var newString = myArray.join("");
    document.getElementById("orderedString").innerHTML = newString;
}
</script>
</body>
</html>

为什么问题中的方法不起作用的解释:

let products = [
    { name: "laptop", price: 800 },
    { name: "phone", price:200},
    { name: "tv", price: 1200}
];
products.sort( (a, b) => {
    {let value= a.name - b.name; console.log(value); return value}
});

> 2 NaN

字符串之间的减法返回NaN。

附和@Alejadro的回答,正确的方法是——

产品。排序(a,b) => a。一、二、三)