繁体   English   中英

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

[英]Sorting Array of Objects based on Index in other array

我有以下数组的唯一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"}]

没有任何库使用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) }); 

我认为排序解决方案非常无效,特别是因为您希望数组稍后会变大。 排序是“最好”的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)

试试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM