![](/img/trans.png)
[英]How to sort an array of objects depending on a custom sort order using underscore
[英]custom sort order on array of objects
我知道我们可以定义 json 对象数组的自定义排序函数。 但是如果订单既不是desc nor asc
? 例如,假设我的数组如下所示:
[ {
name: 'u'
},
{
name: 'n'
},
{
name: 'a'
},
{
name: 'n',
}
]
输出应如下所示:
[ {
name: 'n'
},
{
name: 'n'
},
{
name: 'a'
},
{
name: 'u',
}
]
其中所有以n
开头的名称先排序,然后再排序。 我尝试了以下自定义排序功能:
_sortByName(a, b){
if (a.name === 'n'){
return 1;
} else if(b.name === 'n'){
return 1;
} else if(a.name < b.name){
return 1;
} else if(a.name > b.name){
return -1;
}
}
但是为对象返回的顺序是错误的。 这里出了什么问题?
如果您有任意排序顺序,一个选项是将订单分配给数组,然后使用indexOf
:
var sortOrder = ['n', 'a', 'u']; var myArray = [{ name: 'u' }, { name: 'n' }, { name: 'a' }, { name: 'n' } ]; myArray.sort(function(a, b) { return sortOrder.indexOf(a.name) - sortOrder.indexOf(b.name); }); console.log(myArray);
如果在任一数组中有许多值,则首先创建值索引映射然后使用sortOrder[a.name]
可能是值得的。
1)你可以在这里使用indexOf
const dict = "nau"; var myArray = [ { name: "u", }, { name: "n", }, { name: "a", }, { name: "n", }, ]; myArray.sort((a, b) => dict.indexOf(a.name) - dict.indexOf(b.name)); console.log(myArray);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }
2)你可以在这里使用地图
我在两个character
之间添加了一些间隙/空间,因为它们之间可能会有其他字符,因此您可以将它们放在它们之间
const order = { n: 100, a: 200, u: 300, }; var myArray = [ { name: "u", }, { name: "n", }, { name: "a", }, { name: "n", }, ]; myArray.sort((a, b) => order[a.name] - order[b.name]); console.log(myArray);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */ .as-console-wrapper { max-height: 100% !important; top: 0; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.