gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:40:26 26 4
gpt4 key购买 nike

我有一个包含以下元素的数组(我们称之为 orderArray):
16 | 16 18 | 18 24 | 31 | 33

我有另一个数组(我们称之为 workingArray),其中包含以下元素:
16 | 16 53 | 53 24 | 58 | 58 31 | 18

resultArray 可能如下:例如 [16, 53, 18, 24, 58, 31] 或 [16, 18, 53, 24, 58, 31]

resultArray 应包含workingArray 中的所有元素,但排序顺序不与 orderArray 冲突。
请注意

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

如果已经有一个函数/库可以做到这一点,我会非常高兴 - 我已经尝试过 _.union 但那不起作用。

缺少一些已经编写的代码,实现该目标的最简单算法是什么?

谢谢。

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

最佳答案

主要思想:

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]
<小时/>

That's a good solution, but the order of elements in the result array shouldn't be changed so much - we should try to keep the workingArray with an order as much as the original - sorry I wasn't very clear on that. Please see my edit in the question. --OP

问题仍然没有明确定义,但这将根据 orderArray 对工作数组的子集进行排序,将不在 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]

关于javascript - 根据另一个数组中的位置仅对数组的某些元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12735886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com