按自定义顺序对对象数组进行排序
Sort an object array by custom order
我有一个对象数组,其中有一个名为 'CODE' 的 属性。
[
{
ID: 168,
NAME: "First name",
CODE: "AD"
},
{
ID: 167,
NAME: "Second name",
CODE: "CC"
},
{
ID: 169,
NAME: "Third name",
CODE: "CCM"
},
{
ID: 170,
NAME: "Fourth name",
CODE: "CR"
},
]
如何按自定义顺序对数组进行排序,例如:
var item_order = ["CCM","CR","AD","CC"];
试过各种方法都没有成功。请帮忙
您可以将函数 sort
与函数 indexOf
一起使用。
var array = [ { ID: 168, NAME: "First name", CODE: "AD" }, { ID: 167, NAME: "Second name", CODE: "CC" }, { ID: 169, NAME: "Third name", CODE: "CCM" }, { ID: 170, NAME: "Fourth name", CODE: "CR" }],
item_order = ["CCM","CR","AD","CC"];
array.sort((a, b) => item_order.indexOf(a.CODE) - item_order.indexOf(b.CODE));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您将使用 array.sort(customSort)
,其中:
function customSort(a,b)
{
a = item_order.indexOf(a.CODE);
b = item_order.indexOf(b.CODE);
return a - b;
}
var array = [
{
ID: 168,
NAME: "First name",
CODE: "AD"
},
{
ID: 167,
NAME: "Second name",
CODE: "CC"
},
{
ID: 169,
NAME: "Third name",
CODE: "CCM"
},
{
ID: 170,
NAME: "Fourth name",
CODE: "CR"
},
];
var sortOrder = ["CCM","CR","AD","CC"];
var sorted = array.sort((a, b) => sortOrder.indexOf(a.CODE) - sortOrder.indexOf(a.CODE));
console.log(sorted);
对于大型数组,我建议使用一个对象作为索引。
var array = [{ ID: 168, NAME: "First name", CODE: "AD" }, { ID: 167, NAME: "Second name", CODE: "CC" }, { ID: 169, NAME: "Third name", CODE: "CCM" }, { ID: 170, NAME: "Fourth name", CODE: "CR" }],
item_order = ["CCM", "CR", "AD", "CC"],
order = item_order.reduce((r, k, v) => Object.assign(r, { [k]: v }), {});
array.sort((a, b) => order[a.CODE] - order[b.CODE]);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果你必须经常做这样的事情,你可以写一个小实用程序来帮助:
const array = [{ ID: 168, NAME: "First name", CODE: "AD" }, { ID: 167, NAME: "Second name", CODE: "CC" }, { ID: 169, NAME: "Third name", CODE: "CCM" }, { ID: 170, NAME: "Fourth name", CODE: "CR" },{ ID: 166, NAME: "Fifth name", CODE: "CCM" }, { ID: 171, NAME: "Sixth name", CODE: "XXX" }, { ID: 172, NAME: "Seventh name", CODE: "CR" }]
const sortOn = (prop, list) => {
const order = list.reduce((obj, key, idx) => Object.assign(obj, { [key]: idx + 1}), {});
const getVal = item => order[item[prop]] || Infinity
return (a, b) => getVal(a) - getVal(b)
}
array.sort(sortOn('CODE', ["CCM", "CR", "AD", "CC"]))
console.log(array)
order
对象与 Nina Scholz 建议的非常相似。 idx + 1
而不仅仅是 idx
的原因是为了简化下一行。该行使用 Infinity
作为一种方法,将那些键值未定义或不在排序列表中的键值排序到最后。如果你想要它们在开头,你可以使用 0
或 -Infinity
.
我有一个对象数组,其中有一个名为 'CODE' 的 属性。
[
{
ID: 168,
NAME: "First name",
CODE: "AD"
},
{
ID: 167,
NAME: "Second name",
CODE: "CC"
},
{
ID: 169,
NAME: "Third name",
CODE: "CCM"
},
{
ID: 170,
NAME: "Fourth name",
CODE: "CR"
},
]
如何按自定义顺序对数组进行排序,例如:
var item_order = ["CCM","CR","AD","CC"];
试过各种方法都没有成功。请帮忙
您可以将函数 sort
与函数 indexOf
一起使用。
var array = [ { ID: 168, NAME: "First name", CODE: "AD" }, { ID: 167, NAME: "Second name", CODE: "CC" }, { ID: 169, NAME: "Third name", CODE: "CCM" }, { ID: 170, NAME: "Fourth name", CODE: "CR" }],
item_order = ["CCM","CR","AD","CC"];
array.sort((a, b) => item_order.indexOf(a.CODE) - item_order.indexOf(b.CODE));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
您将使用 array.sort(customSort)
,其中:
function customSort(a,b)
{
a = item_order.indexOf(a.CODE);
b = item_order.indexOf(b.CODE);
return a - b;
}
var array = [
{
ID: 168,
NAME: "First name",
CODE: "AD"
},
{
ID: 167,
NAME: "Second name",
CODE: "CC"
},
{
ID: 169,
NAME: "Third name",
CODE: "CCM"
},
{
ID: 170,
NAME: "Fourth name",
CODE: "CR"
},
];
var sortOrder = ["CCM","CR","AD","CC"];
var sorted = array.sort((a, b) => sortOrder.indexOf(a.CODE) - sortOrder.indexOf(a.CODE));
console.log(sorted);
对于大型数组,我建议使用一个对象作为索引。
var array = [{ ID: 168, NAME: "First name", CODE: "AD" }, { ID: 167, NAME: "Second name", CODE: "CC" }, { ID: 169, NAME: "Third name", CODE: "CCM" }, { ID: 170, NAME: "Fourth name", CODE: "CR" }],
item_order = ["CCM", "CR", "AD", "CC"],
order = item_order.reduce((r, k, v) => Object.assign(r, { [k]: v }), {});
array.sort((a, b) => order[a.CODE] - order[b.CODE]);
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
如果你必须经常做这样的事情,你可以写一个小实用程序来帮助:
const array = [{ ID: 168, NAME: "First name", CODE: "AD" }, { ID: 167, NAME: "Second name", CODE: "CC" }, { ID: 169, NAME: "Third name", CODE: "CCM" }, { ID: 170, NAME: "Fourth name", CODE: "CR" },{ ID: 166, NAME: "Fifth name", CODE: "CCM" }, { ID: 171, NAME: "Sixth name", CODE: "XXX" }, { ID: 172, NAME: "Seventh name", CODE: "CR" }]
const sortOn = (prop, list) => {
const order = list.reduce((obj, key, idx) => Object.assign(obj, { [key]: idx + 1}), {});
const getVal = item => order[item[prop]] || Infinity
return (a, b) => getVal(a) - getVal(b)
}
array.sort(sortOn('CODE', ["CCM", "CR", "AD", "CC"]))
console.log(array)
order
对象与 Nina Scholz 建议的非常相似。 idx + 1
而不仅仅是 idx
的原因是为了简化下一行。该行使用 Infinity
作为一种方法,将那些键值未定义或不在排序列表中的键值排序到最后。如果你想要它们在开头,你可以使用 0
或 -Infinity
.