如何根据字符串对对象进行排序

时间:2019-03-22 04:46:49

标签: javascript

我有一个像这样的对象,我需要通过它按id排序。

"['code', 'id_token']"

我检查了许多示例,并尝试了所有示例,但对我没有任何帮助

我第一次尝试了这个:

64: {id: "83", name: "(83) x"}
65: {id: "84", name: "(84) y"}
66: {id: "85", name: "(85) z"}
67: {id: "86", name: "(86) a"}
68: {id: "9", name: "(9) b"}

然后

obj.sort((a, b) => {
            return a.id > b.id;
        })

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:3)

那么,这样的事情吗?

let op = [{id: "83", name: "(83) x"},
    {id: "84", name: "(84) y"},
    {id: "85", name: "(85) z"},
    {id: "86", name: "(86) a"},
    {id: "9", name: "(9) b"}].sort((a,b) => {
        const nA = Number(a.id);
        const nB = Number(b.id);

        return (nA > nB) ? 1 : ((nB > nA) ? -1 : 0)
    });
    
console.log(op)

当您将“ 83”与“ 9”进行比较时,您正在比较字符串。就像“阿尔弗雷德”(Alfred)由于“ Zac”而位于第一个字母之前一样,“ 83”由于“ 9”而位于第一个字母之前。

注意:正如您从不同的答案和评论中看到的那样,您的排序功能有点罗word。您可以通过返回类似nA - nB而不是整个(nA > nB) ? 1 : ((nB > nA) ? -1 : 0)的内容来简化操作。或者甚至可以使用coercion使其成为单行函数。这里有一些使用胁迫的答案,如果您选择那条路线,则应该接受他们的答案之一。

答案 1 :(得分:3)

您不需要强制-1、1和0结果,因为如果结果为负,则订单将保持不变,如果结果为正,则将互换,因此您可以将它们相减:

let arr = [{id: "83", name: "(83) x"},
    {id: "84", name: "(84) y"},
    {id: "85", name: "(85) z"},
    {id: "86", name: "(86) a"},
    {id: "9", name: "(9) b"}];
    
    
let resp = arr.sort((a, b) => parseInt(a.id) - parseInt(b.id));

console.log(resp);

答案 2 :(得分:2)

对于这里提到的方法,我有另一种解决方法。

首先,我们将对象转换为数组。接下来,我们必须提供自定义排序功能。我们使用localeCompare进行排序,并将numeric: true选项传递给localeCompare。我将locale保留为undefined,但是您可以根据自己的使用情况传入自己的语言环境选项。

const obj = {
  64: {id: "83", name: "(83) x"},
  65: {id: "84", name: "(84) y"},
  66: {id: "85", name: "(85) z"},
  67: {id: "86", name: "(86) a"},
  68: {id: "9", name: "(9) b"}
}

const result = Object.values(obj).sort((a,b) => {
  return a['id'].localeCompare(b['id'], undefined, {numeric: true});
});

console.log(result);

如果您希望将所有内容都压缩到一行,

const result = Object.values(obj).sort((a,b) => a['id'].localeCompare(b['id'],undefined, {numeric: true}));

请阅读有关JavaScript sort方法的更多信息,因为我注意到您正在尝试使用JavaScript的排序对对象/字典进行“直接”排序。它必须为数组格式。

答案 3 :(得分:2)

您的ID是字符串,因此将其转换为int以便sort。改用parseInt

var obj=[{id: "83", name: "(83) x"},{id: "84", name: "(84) y"},{id: "85", name: "(85) z"},{id: "86", name: "(86) a"},{id: "9", name: "(9) b"}];
obj.sort((a, b) => {
            return parseInt(a.id )> parseInt(b.id);
        });
        
console.log(obj);

答案 4 :(得分:2)

请参阅此简短解决方案

obj.sort((a,b) => +a.id-+b.id)