繁体   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