如何检查对象数组中是否同时重复了两个相同的属性?

How to check if in an array of objects two equal properties are repeated at the same time?

我有以下对象数组:

[
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "3"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "1",
   destinationGate: "gate_1",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "2",
   destinationGate: "gate_1",
   destinationTerminal: "3"   
 },
]

我需要检查哪些对象同时重复值 "homeTerminal" 和 "destinationTerminal"。正如我们在示例中看到的,我需要同时检索在两个属性中具有相同值的第一个和第三个对象。

我试图制作一张地图,但我只能用一个值来做,而且我不知道如何通过一次检查两个值来做。 提前谢谢你。

var arr=[
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "3"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "1",
   destinationGate: "gate_1",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "2",
   destinationGate: "gate_1",
   destinationTerminal: "3"   
 },
]


var r=[];
    arr.forEach((element,index) => {
        for(let i=index;i<arr.length;i++){
            if(element.homeTerminal==arr[i].homeTerminal&&element.destinationGate==arr[i].destinationGate){
                if(!r.includes(element))r.push(element);
                if(!r.includes(arr[i]))r.push(arr[i]);
            }
        }
    });

应该可以。你在 r array

中得到结果

您可以使用由字段 homeTerminaldestinationTerminal.

组成的复合键来计算 lookup/map

然后使用该查找查找重复元素。

const lkp = data.reduce((lkp, cur) => {
    const {homeTerminal, destinationTerminal} = cur;
    const key = `${homeTerminal}~~${destinationTerminal}`;

    lkp[key] = lkp[key] || [];

    lkp[key].push(cur);

    return lkp;
}, {});

console.log (lkp);

for (const key in lkp) {
    if (lkp[key].length > 1) 
        console.log ("Duplicate entry", lkp[key])
}
<script>var data = [
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_0",
   homeTerminal: "1",
   destinationGate: "gate_0",
   destinationTerminal: "3"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "1",
   destinationGate: "gate_1",
   destinationTerminal: "2"   
 },
 { 
   homeGate: "gate_1",
   homeTerminal: "2",
   destinationGate: "gate_1",
   destinationTerminal: "3"   
 },
]</script>

您可以 reduce 数组以获得所需的结果。

var arr = [{
  homeGate: "gate_0",
  homeTerminal: "1",
  destinationGate: "gate_0",
  destinationTerminal: "2"
}, {
  homeGate: "gate_0",
  homeTerminal: "3",
  destinationGate: "gate_0",
  destinationTerminal: "2"
}, {
  homeGate: "gate_1",
  homeTerminal: "1",
  destinationGate: "gate_1",
  destinationTerminal: "2"
}, {
  homeGate: "gate_2",
  homeTerminal: "1",
  destinationGate: "gate_2",
  destinationTerminal: "2"
}, {
  homeGate: "gate_1",
  homeTerminal: "2",
  destinationGate: "gate_1",
  destinationTerminal: "3"
}, {
  homeGate: "gate_1",
  homeTerminal: "3",
  destinationGate: "gate_1",
  destinationTerminal: "2"
}]


var result = arr.reduce((retArr, item) => {
  // condition to avoid duplication
  if (!retArr.includes(item)) {
    var filteredArr = arr.filter((i) => {
      return i.homeTerminal === item.homeTerminal && i.destinationTerminal === item.destinationTerminal;
    });
    if (filteredArr.length > 1) retArr = [...retArr, ...filteredArr];
  }
  return retArr;
}, []);

console.log(result);

reduce Array 原型方法有两个参数:

  1. 为数组的每个元素执行的回调函数。
  2. 返回值的初始值
    1. 这个值必须从回调函数返回

回调函数依次接受 3 个参数:

  1. return_value (retArr)
  2. 数组元素(item
  3. 索引未被使用

可以对数组元素进行任何操作,结果必须反映在return_value中(此处为展开值的联系操作)

更多关于 reduce https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce