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