2

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 中的顺序冲突。

4

1 回答 1

2

大意:

orderArray.filter(inWorkingArray).concat(workingArray.filter(notInOrderArray))

(复制orderArray忽略不在工作数组中的项目,然后添加workingArray不在订单数组中的项目)

您可以使用它indexOf来测试成员资格,或者更有效的实现(使所有元素成为对象中的键,这会将它们隐式转换为字符串,从而使该优化不适用于非原始对象)。下面是 just 的最简单示例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]
于 2012-10-04T21:16:06.027 回答