我有一个数组(让我们称之为orderArray
)这些元素:
16 | 18 | 24 | 31 | 33
我有另一个数组(让我们称之为workingArray
)这些元素:
16 | 53 | 24 | 58 | 31 | 18
resultArray
可以如下:
[16,53,18,24,58,31]或[16,18,53,24,58,31]例如
resultArray应该包含workingArray中的所有元素,但排序顺序与orderArray不相符。
请注意
如果已经有一个函数/库可以做到这一点,我会非常高兴 - 我已经尝试_.union
但是这不能完成这项工作。
缺少一些已经制作的代码,最简单的算法是什么?
感谢。
编辑:应尽可能少地更改resultArray中元素的排序顺序 - 应严格执行更改,以免与orderArray中的顺序冲突。
答案 0 :(得分:1)
主要想法:
orderArray.filter(inWorkingArray).concat(workingArray.filter(notInOrderArray))
(复制orderArray
忽略不在工作数组中的项目,然后处理workingArray
中不在订单数组中的项目
您可以使用indexOf
来测试成员资格,或者使用更有效的实现(在对象中创建所有元素键,这将隐式地将它们转换为字符串,使得该优化不适用于非基本对象)。下面是仅使用indexOf
的最简单的示例,它甚至可以推广到非基本对象(如子数组):
var inWorkingArray = function(x) {return workingArray.indexOf(x)!=-1};
var notInOrderArray = function(x) {return orderArray.indexOf(x)==-1};
结果:
[16, 18, 24, 31, 53, 58]
这是一个很好的解决方案,但结果数组中元素的顺序不应该改变太多 - 我们应该尽量保持workingArray的顺序与原始顺序一样 - 抱歉我不是很清楚。请在问题中查看我的编辑。 --OP
问题仍然没有明确定义,但是这会根据orderArray对workingArray的子集进行排序,而不是在orderArray中保留元素:
var intersection = orderArray.filter(inWorkingArray);
var c=0;
workingArray.map(function(x){
return notInOrderArray(x) ? x : intersection[c++];
});
结果:
[16, 53, 18, 58, 24, 31]