基于其他数组中的索引对对象数组进行排序

时间:2016-05-30 22:49:37

标签: javascript arrays sorting lodash

我有以下唯一ID数组:

>>> test("--van")
van get_all None
>>> test("--car --id 123")
car id 123
>>> test("--model_no 55 --van")
van model_no 55
>>> test("--car --id") #invalid because there is no request value
usage: test.py [-h] (--car | --van)
               [--color REQUEST | --id REQUEST | --model_no REQUEST]
test.py: error: argument --id: expected one argument

我有另一个对象数组:

idArray = ["56f4cf96dd2ca7275feaf802",
"56f4cf96dd2ca7275feaf7b7",
"56f4cf96dd2ca7275feaf805",
"56f4cf96dd2ca7275feaf7ac"]

如何根据第一个数组的索引对第二个数组进行排序?最好使用lodash,因为阵列可以增长一点。

到目前为止,我有以下内容从第一个数组中获取索引:

stories = [{"title": Story2, id = "56f4cf96dd2ca7275feaf7b7"},
{"title": Story4, id = "56f4cf96dd2ca7275feaf7ac"},
{"title": Story1, id = "56f4cf96dd2ca7275feaf802"},
{"title": Story3, id = "56f4cf96dd2ca7275feaf805"}]

尝试_.map()和_.sortBy()的不同组合我似乎无法正确获得我想要的结果:

var sortArray = _.toPairs(idArray)

[ [ '0', 56f4cf96dd2ca7275feaf802 ],
[ '1', 56f4cf96dd2ca7275feaf7b7 ],
[ '2', 56f4cf96dd2ca7275feaf805 ],
[ '3', 56f4cf96dd2ca7275feaf7ac ] ]

3 个答案:

答案 0 :(得分:3)

使用Array.sort()

可以不使用任何库



var stories = [{"title": 'Story2', id : "56f4cf96dd2ca7275feaf7b7"},
{"title": 'Story4', id : "56f4cf96dd2ca7275feaf7ac"},
{"title": 'Story1', id : "56f4cf96dd2ca7275feaf802"},
{"title": 'Story3', id : "56f4cf96dd2ca7275feaf805"}];

var idArray = ["56f4cf96dd2ca7275feaf802",
"56f4cf96dd2ca7275feaf7b7",
"56f4cf96dd2ca7275feaf805",
"56f4cf96dd2ca7275feaf7ac"];

var ordered = stories.sort(function(a, b){
	return idArray.indexOf(a.id) - idArray.indexOf(b.id);
});

ordered.forEach( element =>{ console.log(element) });




答案 1 :(得分:3)

我认为排序解决方案非常无效,特别是因为您希望数组稍后会变大。最好排序""一个O(2n)操作,而你每个循环有两个indexOf操作另一个O(2n ^ 2)。我提出以下内容,它将胜过大数组中的排序方法。



var stories = [{"title": 'Story2', id : "56f4cf96dd2ca7275feaf7b7"},
{"title": 'Story4', id : "56f4cf96dd2ca7275feaf7ac"},
{"title": 'Story1', id : "56f4cf96dd2ca7275feaf802"},
{"title": 'Story3', id : "56f4cf96dd2ca7275feaf805"}],

    idArray = ["56f4cf96dd2ca7275feaf802",
"56f4cf96dd2ca7275feaf7b7",
"56f4cf96dd2ca7275feaf805",
"56f4cf96dd2ca7275feaf7ac"],

ordered = idArray.reduce((p,c) => p.concat(stories.find(f => f.id == c)) ,[]);

console.log(ordered);




仅O(n ^ 2)

答案 2 :(得分:1)

试试这个

var idsToIndexes = {};

for (var i = 0; i < idArray.length; i++)
    idsToIndexes[idArray[i]] = i;

stories.sort(function(a, b){return idsToIndexes[a.id] - idsToIndexes[b.id];});