【问题标题】:Comparing two JavaScript Arrays of Objects and removing common Array Objects比较两个 JavaScript 对象数组并删除常见的数组对象
【发布时间】:2017-06-01 01:07:57
【问题描述】:
var a = [
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ]
];
var b = [
  [
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ]
];

function remove_duplicates(a, b) {
    for (var i = 0, len = a.length; i < len; i++) {
        for (var j = 0, len = b.length; j < len; j++) {
            if (a[i].name == b[j].name) {
                b.splice(j, 1);
            }
        }
    }

    console.log(a);
    console.log(b);

}

console.log(a);
console.log(b);

remove_duplicates(a,b);

我已经尝试了过滤器和减少,但它们得到了想要的结果 我找到了一个similar one,但我的结构几乎没有什么不同

从 JavaScript 或下划线中寻找可能的解决方案

预期结果:[[{"id":"BBB"}],[{"id":"CCC"},{"id":"BBB"}],[{"id":"AAA"}],[‌​{"id":"DDD"}],[{"id"‌​:"CCC"},{"id":"DDD"}‌​]]

【问题讨论】:

  • 您应该发布您期望/想要返回的结果对象,以便更容易准确地理解您正在寻找什么。
  • 将预期结果添加到问题@anied
  • 你的应用中使用过 lodash 吗?如果是,您可以使用方法 differenceWith lodash.com/docs/4.17.4#differenceWith

标签: javascript underscore.js


【解决方案1】:

首先我们需要知道两个数组何时相等。我在 isEqual 函数中定义了这一点,如果数组长度相同且对象具有相同的 id 且顺序相同,则数组等于另一个数组。

接下来,我们需要了解“删除重复项”的含义。想象一下,如果你有两个数字数组。 [1,2,3,4] 和 [2,4,5,6]。我们期望结果是 [1,3,5,6]。我们通过获取第一个数组并减去第二个数组中存在的任何项目,然后获取第二个数组并减去第一个数组中存在的任何项目来做到这一点。最后,我们将这两个结果结合在一起。这就是 remove_duplicates 函数中发生的事情。

var a = [
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ]
];
var b = [
  [
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ]
];

function remove_duplicates(a, b) {
  var setOfB = setOf(b);
  var setOfA = setOf(a);

  var aMinusB = minus(setOfA, setOfB);
  var bMinusA = minus(setOfB, setOfA);
  return aMinusB.concat(bMinusA);
}

function setOf(array){
  return _.uniq(array, false, JSON.stringify);
}

function minus(a,b) {
  return _.reject(b, function(item){
    return _.find(a, _.partial(_.isEqual, item));
  });
}


// var expected = [
//   [{"id":"BBB"}],
//   [{"id":"CCC"},{"id":"BBB"}],
//   [{"id":"AAA"}],
//   [{"id":"DDD"}],
//   [{"id":"CCC"},{"id":"DDD"}]
// ];


console.log(remove_duplicates(a,b));

【讨论】:

  • 感谢您的快速响应,但执行后仍然重复,我看到 AAA 重复了。给定代码的结果:[[{"id":"BBB"}],[{"id":"CCC"},{"id":"BBB"}],[{"id":"AAA"}],[{"id":"DDD"}],[{"id":"CCC"},{"id":"DDD"}],[{"id":"AAA"}]] 和预期结果:[[{"id":"BBB"}],[{"id":"CCC"},{"id":"BBB"}],[{"id":"AAA"}],[{"id":"DDD"}],[{"id":"CCC"},{"id":"DDD"}]]
  • 我们能否避免在返回的对象的末尾添加重复或删除重复
  • 你能解释一下var bMinusA = minus(b,a);的用途是什么,当我检查它返回0的长度时
  • 啊,是的,我忘了删除 B 中的重复项。解决方案已更新
  • 使用 bMinusA 是从 B 中的项目中删除 A 中的项目。虽然它们在您的问题中不存在,但如果您将不同的数组传递给 remove_duplicates 函数,它们可能存在。阅读以下 wiki 页面:en.wikipedia.org/wiki/Exclusive_or
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多