我有一个JavaScript函数,该函数在同一随机位置上分割两个具有不同数字0-9的等长数组,取第一个数组的左侧部分和第二个数组的右侧部分,并将两个部分合并为一个新数组:
function splitAndMerge(arr1, arr2) {
let slicingLocation = Math.floor(Math.random() * 10); // 6
let arr1Subarray = arr1.slice(0, slicingLocation);
let arr2Subarray = arr2.slice(slicingLocation);
return arr1Subarray.concat(arr2Subarray);
}
let foo = [7, 0, 6, 5, 4, 3, 2, 9, 1, 8];
let bar = [1, 3, 8, 5, 9, 4, 7, 2, 0, 6];
let newArray = splitAndMerge(foo, bar);
/*
Slicing at index 6:
[7, 0, 6, 5, 4, 3, | 2, 9, 1, 8];
[1, 3, 8, 5, 9, 4, | 7, 2, 0, 6];
Returns [7, 0, 6, 5, 4, 3, 7, 2, 0, 6];
*/
是否有办法从bar
中删除所有重复项,并用新的不同值替换它们(返回的数组应类似于[7, 0, 6, 5, 4, 3, 1, 2, 8, 9]
)?
答案 0 :(得分:1)
您可以通过对空Set
s
进行闭包来存储所有使用的值,对下一个未使用的值使用变量i
来映射合并的数组。
在映射中,将根据集合检查该值,如果不包括该值,则返回该值。如果未选中该集合,则使用下一个可能的值ID(如果已使用),将其递增,直到找到未使用的值。
然后将值添加到集合中,以防止再次使用该值并返回该值。
var array = [7, 0, 6, 5, 4, 3, 7, 2, 0, 6],
result = array.map(((s, i) => v => {
if (!s.has(v)) {
s.add(v);
return v;
}
while (s.has(i)) ++i;
s.add(i);
return i;
})(new Set, 0));
console.log(result.join(' '));
答案 1 :(得分:-1)
var selected = Array.from(new Set(newArray.map(c => c)));