JavaScript-用唯一值替换数组中所有重复的值

时间:2018-09-06 09:39:30

标签: javascript arrays

我有一个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])?

2 个答案:

答案 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)));