[英]JS Practice - Filtering for duplicated items in an array
我正在尝试提高自己的JavaScript技能,但遇到了我正在解决的问题。
//给定一个整数数组,输出总计为特定值p的所有对。
var sum = function(array, value){
var solutionArray = [];
for (i = 0; i < array.length; i++){
for(j = 0; j < array.length; j++){
if(array[i] + array[j] === value){
solutionArray.push([array[i], array[j]]);
}
}
}
return solutionArray;
};
这个“有效”,但我不能过滤重复项。 我只希望有一场比赛,而不是多次比赛。 如果有人有任何建议,我将不胜感激。
我一直在尝试在if语句中添加&&案例。 我还没有找到使之可行的逻辑。
在返回数组之前和完成两个循环之后,我还一直在尝试对数组进行过滤。
这是我提出的问题的副本: http ://repl.it/QIk/1
这将比O(N ^ 2)检查更有效率。
var seen = {};
solutionArray = solutionArray.reduce(function(result, currentItem) {
if (currentItem.join("") in seen === false) {
result.push(currentItem);
seen[currentItem.join("")] = false;
}
return result;
}, []);
return solutionArray;
检查更新的repl.it链接
这样就可以解决该问题,而不必迭代以前的结果,并且还要注意删除重复项。
这些步骤是:
这是代码:
var sum = function(array, value){
var alreadyExists = {};
var solutionArray = [];
for (i = 0; i < array.length; i++){
for(j = i+1; j < array.length; j++){
if(array[i] + array[j] === value) {
var pair = [array[i], array[j]];
var pairKey = pair.sort().join(",");
if ( ! alreadyExists.hasOwnProperty(pairKey) ) {
solutionArray.push(pair);
alreadyExists[pairKey] = 1;
}
}
}
}
return solutionArray;
};
注意:自从原始帖子以来,我已经修改了以下内容的双循环:
for (i = 0; i < array.length; i++){
for(j = 0; j < array.length; j++){
至:
for (i = 0; i < array.length; i++){
for(j = i+1; j < array.length; j++){
因为那有两个问题:
应该这样做:
var sum = function(array, value){
var solutionArray = [];
for (i = 0; i < array.length; i++){
for(j = 0; j < array.length; j++){
if(array[i] + array[j] === value) {
var alreadyExists = solutionArray.some(function (it) {
return it[0] === array[i] && it[1] === array[j];
});
if ( ! alreadyExists) {
solutionArray.push([array[i], array[j]]);
}
}
}
}
return solutionArray;
};
要还排除反向对,请更改:
return it[0] === array[i] && it[1] === array[j];
至
return (
(it[0] === array[i] && it[1] === array[j]) ||
(it[1] === array[i] && it[0] === array[j])
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.