我有一个像这样的对象,我需要通过它按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;
})
有人可以帮忙吗?
答案 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)