簡體   English   中英

JS練習-篩選數組中的重復項

[英]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鏈接

這樣就可以解決該問題,而不必迭代以前的結果,並且還要注意刪除重復項。

這些步驟是:

  1. 建立一對(a,b)其中a + b == value
  2. 排序該對,即:對(1,2)和(2,1)將變為(1,2)
  3. 建立一個由任何字符(即“,”)排序的對組成的字符串,即:pair(1,2)=> pairKey ='1-2';
  4. 檢查pairKey是否存在於對象上(alreadyExists),如果不存在,將其添加到結果中並將其標記為已經存在

這是代碼:

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;    
};

http://repl.it/QIk/3上

注意:自從原始帖子以來,我已經修改了以下內容的雙循環:

  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++){

因為那有兩個問題:

  1. 它檢查每個元素本身是否給出錯誤對作為結果(即:[5,0]提供了像[5,5]這樣的對)
  2. 它遍歷了先前分析過的組合,即:[1,2,3] ==> 1 + 2和2 + 1(已進行檢查),因此我們可以減少迭代次數。

應該這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM