避免插入子阵列重复

时间:2017-01-02 21:19:09

标签: javascript arrays

此刻我很难过。本质上我正在尝试创建一个函数,其中它将一个数字作为引用和一个数组,并找到一个组合(引用数字和数组中的两个)等于零而不在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进行测试,但似乎它在使用subArrays时效果不佳。

2 个答案:

答案 0 :(得分: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为真,因此我们跳过将它添加到数组中。

答案 1 :(得分: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));

相关问题