【问题标题】:Comparing two arrays of nested objects and return new array of objects if compared values are not the same in javascript比较两个嵌套对象数组并在javascript中比较的值不相同时返回新的对象数组
【发布时间】:2021-11-04 11:50:46
【问题描述】:

我一直无法弄清楚如何让它发挥作用。我有两个嵌套对象数组 arr1 和 arr2。

let arr1 =[{
        id: 1,
        rideS: [
        {
          id: 12,
          station: {
            id: 23,
            street: "ABC"
          }
        }
      ]
},
  {
    id: 2,
        rideS: [
        {
          id: 13,
          station: {
            id: 24,
            street: "MMM"
          }
        }
      ]
  }
 ]
 
let arr2 = [
      {
        id: 1,
        so: {
          id: 33,
          sos: [{
            id: 44,
            station: {
              id: 55,
              street: "ABC"
            }
          },
          {
            id: 74,
            station: {
              id: 11,
              street: "DDD"
            }
          }
            
            ]
        }
      },
        {
        id: 2,
        so: {
          id: 34,
          sos: [{
            id: 45,
            station: {
              id: 56,
              street: "RRR"
            }
          },
            {
            id: 51,
            station: {
              id: 66,
              street: "ZZZ"
            }
          }
            ]
        }
      },
    {
        id: 3,
        so: {
          id: 35,
          sos: [{
            id: 46,
            station: {
              id: 57,
              street: "MMM"
            }
          },
            {
            id: 75,
            station: {
              id: 66,
              street: "VVV"
            }
          }
            
            ]
        }
      }
   ]

我需要使用“sos”中第一个对象数组的“street”属性值将 arr2 与 arr1 进行比较,结果我需要返回不匹配的对象

例如,如果我将这两个数组作为我期望的结果进行比较:

let result = [ 
 {
        id: 2,
        so: {
          id: 34,
          sos: [{
            id: 45,
            station: {
              id: 56,
              street: "RRR"
            }
          },
            {
            id: 51,
            station: {
              id: 66,
              street: "ZZZ"
            }
          }
            ]
        }
      }
]

这就是我尝试做的事情

let result = arr2.filter(o1 => o1.so.sos.some(o2 => !arr1.some(a1=> a1.rideS.some(a2 => o2.station.street === a2.station.street))))

结果我得到了所有对象,但我需要这样的问题:

 let result = arr2.filter(o1 => o1.so.sos[0].some(o2 => !arr1.some(a1=> a1.rideS.some(a2 => o2.station.street === a2.station.street))))

【问题讨论】:

  • 您是说即使在 Arr1 中预设的街道名称之一与 Arr2 匹配,而不管它应该被删除的任何其他属性如何?
  • 是的,先生,如果 arr1 中的任何街道名称与 arr2 中的街道属性名称相同(但仅与数组“sos”的第一个对象比较),则不会在结果中返回

标签: javascript arrays reactjs ecmascript-6 filter


【解决方案1】:

首先,我们需要在名为streetDic 的字典中取出所有街道地址,然后如果streetDic 中的街道中不存在任何值,则检查数组二。

let arr1 =[{
    id: 1,
    rideS: [
    {
      id: 12,
      station: {
        id: 23,
        street: "ABC"
      }
    }
  ]
},
{
id: 2,
    rideS: [
    {
      id: 13,
      station: {
        id: 24,
        street: "MMM"
      }
    }
  ]
}
]

let arr2 = [
  {
    id: 1,
    so: {
      id: 33,
      sos: [{
        id: 44,
        station: {
          id: 55,
          street: "ABC"
        }
      },
      {
        id: 74,
        station: {
          id: 11,
          street: "DDD"
        }
      }
        
        ]
    }
  },
    {
    id: 2,
    so: {
      id: 34,
      sos: [{
        id: 45,
        station: {
          id: 56,
          street: "RRR"
        }
      },
        {
        id: 51,
        station: {
          id: 66,
          street: "ZZZ"
        }
      }
        ]
    }
  },
{
    id: 3,
    so: {
      id: 35,
      sos: [{
        id: 46,
        station: {
          id: 57,
          street: "MMM"
        }
      },
        {
        id: 75,
        station: {
          id: 66,
          street: "VVV"
        }
      }
        
        ]
    }
  }
]



let streetDic = arr1.reduce((dic, o) => {   o.rideS.forEach(r => dic[r.station.street] = true); return dic; } , {})

let result = arr2.filter(o => !o.so.sos.some(s => streetDic[s.station.street]))

console.log(result);

【讨论】:

    【解决方案2】:

    尝试用every替换some

    let arr1 = [
      { id: 1, rideS: [{id: 12, station: {id: 23, street: "ABC",},},],},
      { id: 2, rideS: [{id: 13, station: {id: 24, street: "MMM",},},],},
    ];
    
    let arr2 = [
      {id: 1, so: {id: 33, sos: [{id: 44,station: {id: 55,street: "ABC",},}, {id: 74, station: {id: 11, street: "DDD",},},],},},
      {id: 2, so: {id: 34,sos: [{id: 45, station: {id: 56, street: "RRR",},},{id: 51, station: {id: 66, street: "ZZZ",},},],},},
      {id: 3, so: {id: 35, sos: [{id: 46, station: {id: 57, street: "MMM",},},{id: 75, station: {id: 66, street: "VVV",},},],},},
    ];
        
    let result = arr2.filter(o1 => o1.so.sos.every(o2 => !arr1.some(a1 => a1.rideS.some(a2 => o2.station.street === a2.station.street))))
    console.log(result)

    【讨论】:

    • 不用感谢我,这是你的代码,我刚刚发现你的失误 :) 干杯 :),
    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多