[英]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.