2017-01-02 122 views
1

我很困惑。本质上,我试图创建一个函数,它将一个数字作为参考和一个数组,并且找到等于零的组合(参考数字和数组中的两个),但不会在subArray中有任何重复的组合。避免插入子数组重复项

function helper(number, arr){ 
    console.log(arr, 'this is arr') 
    let answer = []; 
    let subArray = [] 
    for(let i = 0; i < arr.length; i++){ 
    for(let y = i + 1; y < arr.length; y++){ 
     var newCombo = [arr[i], arr[y]] 
     subArray.push(newCombo) <-- avoid duplicates here 
    } 
    } 
    subArray.forEach(combo =>{ 
    var referenceAndArray = [number].concat(combo) 
    //result will check it adds up to zero 
    var result = referenceAndArray.reduce((accum, value) =>{ 
     return accum += value; 
    },0) 

    if(result === 0){ 
     answer.push(referenceAndArray) 
    } 
    }) 

    return answer 
} 

helper(-1, [-1,-1,0,1,2] --> [ [-1, 0, 1 ], [-1, -1, 2] ] 

我们可以假设数组从一开始就

使用Array.includes我试图测试,但它似乎不具有子阵列以及工作排序。

+0

发现仅有1个组合或者所有可能的组合? – luanped

+0

找到所有可能的组合,没有任何重复 – Alejandro

+1

数组通过身份而不是数值进行比较,所以'[]!== []' – elclanrs

回答

1

由于数组是通过身份而不是值进行比较的,因此您可以加入数组内容并比较它是否已经存在。

基本上替换subArray.push(newCombo) <-- avoid duplicates here

let exists = subArray.some(combo => combo.join() === newCombo.join()); if (!exists) { subArray.push(newCombo); }

例如,如果你有一个包含[[-1, -1, 2], [-1, 0, 1]]阵列和当你发现另一组合[-1, -1, 2];在插入它之前,我们检查它是否已经存在,并且只有在没有时才添加它。要做到这一点,将通过数组循环检查字符串“-1,-1,2”是否已经使用.some()(只要数组中的1个元素匹配,就是true)。在这种情况下,我们比较“-1,-1,2”和“-1,0,1”,因此exists为真,因此我们将其添加到数组中。

+0

工作很好!我不知道'Array.prototype.some'。 Def有用! – Alejandro

1

您可以使用Set,并存储对的字符串版本,这将保证不存储重复项。这将工作速度比在阵列

这里查找元素是用最少的适应您的代码,使其工作方式:

function helper(number, arr){ 
 
    console.log(JSON.stringify(arr), 'this is arr'); 
 
    let answer = []; 
 
    let subArray = []; 
 
    let uniques = new Set; 
 
    for(let i = 0; i < arr.length; i++){ 
 
    for(let y = i + 1; y < arr.length; y++){ 
 
     uniques.add(arr[i] + ',' + arr[y]); // add primitive (string) to set. 
 
    } 
 
    } 
 
    uniques.forEach(s => { 
 
    // now get the number parts of the stored string: 
 
    var referenceAndArray = [number].concat(s.split(',').map(Number)); 
 
    //result will check it adds up to zero 
 
    var result = referenceAndArray.reduce((accum, value) =>{ 
 
     return accum += value; 
 
    }, 0) 
 

 
    if(result === 0){ 
 
     answer.push(referenceAndArray); 
 
    } 
 
    }) 
 

 
    return answer; 
 
} 
 

 
var result = helper(-1, [-1,-1,0,1,2]); //--> [ [-1, 0, 1 ], [-1, -1, 2] ] 
 
console.log(JSON.stringify(result));