所以我有一个类似于下面的对象数组:
var objs = [
{ key: 'address', value: '1234 street' },
{ key: 'nameAndTitle', value: 'John Smith, CEO' },
{ key: 'contactEmail', value: 'johnsmith@gmail.com' },
{ key: 'contactPhone', value: '1234567890' },
{ key: 'localPhone', value: '1234567890' },
{ key: 'status', value: 'open' },
]
我希望它与我拥有的另一个看起来像这样的字符串的顺序相同。
var keys = [
'nameAndTitle',
'contactPhone',
'contactEmail',
'address',
]
我想订购objs
数组以匹配keys
数组的顺序。如果keys
数组中不存在该对象,则应将其放在底部。有人可以帮我吗?
答案 0 :(得分:3)
您可以获取索引并按其增量进行排序。
var objs = [{ key: 'address', value: '1234 street' }, { key: 'nameAndTitle', value: 'John Smith, CEO' }, { key: 'contactEmail', value: 'johnsmith@gmail.com' }, { key: 'contactPhone', value: '1234567890' }],
keys = ['nameAndTitle', 'contactPhone', 'contactEmail', 'address'];
objs.sort((a, b) => keys.indexOf(a.key) - keys.indexOf(b.key));
console.log(objs);
.as-console-wrapper { max-height: 100% !important; top: 0; }
要完全控制订单,您可以使用所需订单的值作为对象,并使用默认属性,该属性的值小于所有其他值,以将未知键排在最前面或大于所有其他值到数组的底部。
这种方法也适用于花式排序方案,如果需要,可以将未知项目排序到中间。
var objs = [{ key: 'localPhone', value: '1234567890' }, { key: 'status', value: 'open' }, { key: 'address', value: '1234 street' }, { key: 'nameAndTitle', value: 'John Smith, CEO' }, { key: 'contactEmail', value: 'johnsmith@gmail.com' }, { key: 'contactPhone', value: '1234567890' }],
order = { nameAndTitle: 1, contactPhone: 2, contactEmail: 3, address: 4, default: Infinity };
objs.sort(({ key: a }, { key: b }) => (order[a] || order.default) - (order[b] || order.default));
console.log(objs);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES5
var objs = [{ key: 'localPhone', value: '1234567890' }, { key: 'status', value: 'open' }, { key: 'address', value: '1234 street' }, { key: 'nameAndTitle', value: 'John Smith, CEO' }, { key: 'contactEmail', value: 'johnsmith@gmail.com' }, { key: 'contactPhone', value: '1234567890' }],
order = { nameAndTitle: 1, contactPhone: 2, contactEmail: 3, address: 4, default: Infinity };
objs.sort(function (a, b) {
return (order[a.key] || order.default) - (order[b.key] || order.default);
});
console.log(objs);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
您可以创建一个新数组,以正确的顺序推送对象,不会修改原始数组。
如果您不介意修改原始数组,则可以调用sort函数,该函数将检查keys
数组中的键位置(我相信您会得到一些答案帮助您使用这些方法)
编辑 @Nina Scholz快速完成了^^
const objs = [{
key: 'address',
value: '1234 street'
},
{
key: 'nameAndTitle',
value: 'John Smith, CEO'
},
{
key: 'contactEmail',
value: 'johnsmith@gmail.com'
},
{
key: 'contactPhone',
value: '1234567890'
},
];
const keys = [
'nameAndTitle',
'contactPhone',
'contactEmail',
'address',
];
const array = keys.reduce((tmp, x) => {
const item = objs.find(y => y.key === x);
if (item) {
tmp.push(item);
}
return tmp;
}, []);
console.log(array);
答案 2 :(得分:0)
如果可以对数组进行突变,则可以按以下方式使用sort
函数:
var objs = [{
key: 'address',
value: '1234 street'
},
{
key: 'nameAndTitle',
value: 'John Smith, CEO'
},
{
key: 'contactEmail',
value: 'johnsmith@gmail.com'
},
{
key: 'contactPhone',
value: '1234567890'
}
]
var keys = [
'nameAndTitle',
'contactPhone',
'contactEmail',
'address',
]
objs.sort(function(a, b) {
return keys.indexOf(a.key) - keys.indexOf(b.key);
});
console.log(objs)
答案 3 :(得分:0)
您可以执行以下操作:
循环遍历字符串数组。将值(nameAndTitle)与obj数组的相同索引的值进行比较。如果不匹配,请在obj数组的键标记中搜索该字符串,然后将其移至正确的索引。那就是我会怎么做