对不起,标题,我真的不知道该怎么写。我被困住了,我需要按照其对象的title属性值将数组排序为第二个字符串数组的顺序。
基本上,我有两个数组...
var titles = [
'title1',
'title2',
'title3',
'title4',
'title5'
]
var objects = [
{
title: 'title5',
...//other values
}, {
title: 'title3',
...//other values
}
, {
title: 'title4',
...//other values
}, {
title: 'title1',
...//other values
}, {
title: 'title2',
...//other values
}
]
我想按与objects
数组中的字符串相同的顺序对titles
数组进行排序。这可能吗?我的代码库可以访问_underscore,或者我可以使用普通的ES6。
答案 0 :(得分:2)
您可以从titles数组创建对象,并将其用于排序对象数组。
var objects = [{"title":"title5"},{"title":"title3"},{"title":"title4"},{"title":"title1"},{"title":"title2"}]
var titles = ['title1','title2','title3','title4','title5'].reduce((r, e, i) => Object.assign(r, {[e]: i}), {})
objects.sort((a, b) => titles[a.title] - titles[b.title])
console.log(objects)
答案 1 :(得分:1)
是的,这很有可能。我个人将遵循“装饰-排序-取消装饰”模式:
var titles = [
'title1',
'title2',
'title3',
'title4',
'title5'
]
var objects = [
{
title: 'title5',
//other values
}, {
title: 'title3',
//other values
}
, {
title: 'title4',
//other values
}, {
title: 'title1',
//other values
}, {
title: 'title2',
//other values
}
]
var rankings = objects.map( o => ({
object: o,
ranking: titles.indexOf(o.title)
}))
rankings.sort((a, b) => a.ranking-b.ranking)
var sortedObjects = rankings.map(r => r.object);
console.log(sortedObjects);
答案 2 :(得分:0)
您可以使用_.indexBy从Object
变量中创建一个objects
,然后映射titles
:
const objectsByTitle = _.indexBy(objects, 'title');
const result = titles.map(it => objectsByTitle[it]);
标题应该是唯一的。
答案 3 :(得分:-1)
有一个简单(但成本高昂)的解决方案:
let titles = ['foo', 'bar', 'fizz', 'buzz']
let objects = [{title: 'fizz'}, {title: 'bar'}, {title: 'buzz'}, {title: 'foo'}]
console.log(titles.map(title => objects.find(o => o.title === title)))
但是这是ao(n²)解决方案,我很确定您的需求可能会有所不同,并且您可以使用title
作为键来使用对象。
答案 4 :(得分:-1)
您能检查一下是否解决了您的需求吗?
var titles = [
'title1',
'title2',
'title3',
'title4',
'title5'
]
var objects = [
{
title: 'title5',
}, {
title: 'title3',
}
, {
title: 'title4',
}, {
title: 'title1',
}, {
title: 'title2',
}
]
function compare(a,b) {
if (a.title < b.title)
return -1;
if (a.title > b.title)
return 1;
return 0;
}
console.log(objects.sort(compare));
答案 5 :(得分:-2)
使用查找,我们从对象中找到匹配的标题元素,并使用 map
将其映射到新数组
var titles = ['title1','title2','title3','title4','title5']
var objects = [{title: 'title5',}, { title: 'title3',},{title: 'title4',}, {title: 'title1',}, {title: 'title2',} ]
let op = titles.map(e=> objects.find(({title})=> title === e))
console.log(op)