javascript - 根据另一个数组中的位置仅排序数组的某些元素

时间:2012-10-04 21:02:54

标签: javascript sorting

我有一个数组(让我们称之为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不相符。
请注意

  • orderArray和workingArray可以在彼此之间有不同的元素
  • 元素在数组中是唯一的

如果已经有一个函数/库可以做到这一点,我会非常高兴 - 我已经尝试_.union但是这不能完成这项工作。

缺少一些已经制作的代码,最简单的算法是什么?

感谢。

编辑:应尽可能少地更改resultArray中元素的排序顺序 - 应严格执行更改,以免与orderArray中的顺序冲突。

1 个答案:

答案 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]