根据另一个数组中的索引对对象数组进行排序

3
我有以下唯一ID的数组:
idArray = ["56f4cf96dd2ca7275feaf802",
"56f4cf96dd2ca7275feaf7b7",
"56f4cf96dd2ca7275feaf805",
"56f4cf96dd2ca7275feaf7ac"]

我有另一个对象数组:

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

如何根据第一个数组的索引对第二个数组进行排序?最好使用lodash,因为数组可能会变得更大。
到目前为止,我已经通过以下方式从第一个数组中获取了索引:
var sortArray = _.toPairs(idArray)

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

尝试使用不同的_.map()和_.sortBy()组合,我似乎无法正确地获得想要的结果,该结果是:
desiredResult = [{"title": Story1, id = "56f4cf96dd2ca7275feaf802"},
          {"title": Story2, id = "56f4cf96dd2ca7275feaf7b7"},
          {"title": Story3, id = "56f4cf96dd2ca7275feaf805"},
          {"title": Story4, id = "56f4cf96dd2ca7275feaf7ac"}]
3个回答

4

我认为排序解决方案非常低效,尤其是当您预计数组稍后会变得更大时。排序“在最好的情况下”是一个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)。


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) });


2
正是我的想法。你比我先说了出来...这里,试试这个:https://jsfiddle.net/jx3we8q7/ ;) - Pevara
1
谢谢,非常好的答案。使用'return idArray.indexOf(b.id) - dArray.indexOf(a.id)'来反转顺序可以吗?还是应该在结果数组上使用reverse()函数? - user1202888
1
我认为这样做没有什么不好的。 - Jose Hermosilla Rodrigo

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];});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接