【问题标题】:How to filter array with other array如何用其他数组过滤数组
【发布时间】:2021-03-05 08:37:35
【问题描述】:

我有两个数组,其中一个是这样的:

 const array1 =  [
      Object {
        "ItemId": 1,
        
      },
      Object {
        "ItemId": 2,
        
      },
    ]  

其他数组是:

     const array2 = [
      Object {
        "obj1": Object {
    
          "Id": 4736,
    
        },
        "obj2": Object {
    
          "ItemId": 1,
     
        },
      }
]

我想获取array1 中的项目,这些项目在array2 的obj2 中不等于。

我试过了,但是没用

array1.filter(function (item) {
        return array2.map((x) => {
          return x.obj2 != item;
        });

【问题讨论】:

  • array2 不是一个有效的数组吗?复制/粘贴时出了什么问题?
  • 三个问题立即引起了我的注意: 1. array1.filter 期待一个真实的值,而 array2.map 总是返回一个数组。在这种情况下,它将永远是真实的。 2. array2.map 只是用回调函数(x.obj2 != item)的结果创建一个新数组。这将返回一个填充了布尔值的数组。 [true, false, true] 3. 比较看起来对我来说。两个对象(item 和 x.obj)是否引用同一个对象引用?如果没有,您可能宁愿将 item.ItemId 与 obj2.ItemId 进行比较。
  • @webwelten 你是对的,它返回布尔值。这是我的错。其实我想得到对象。他们也指的是同一个对象。我也可以使用 ItemId 过滤

标签: react-native


【解决方案1】:

您正在寻找Array.protype.someArray.prototype.every 而不是array2.map。为什么?

array1.filter 期望每个项目都有一个真实值。

array2.map 正在返回一个数组 (!) 及其回调结果。在您的情况下,这是每个比较x.obj2 != item 的结果。它可能看起来像这样:[true, false]。但是这个数组总是会计算为真。

array2.some() 或 array2.every() 也遍历数组,但会为您使用的条件返回一个布尔值。您可以自己尝试,然后查看代码示例。

 const array1 =  [
  {
    "ItemId": 1,
  },
  {
    "ItemId": 2,
  },
];
    
const array2 = [
  {
    "obj1": {
      "ItemId": 4736,
    },
    "obj2": {
      "ItemId": 1,
    },
  },
];

// errornous filter usage
const test = array1.filter(item => {
  const arr = array2.map(x => x.obj2 !== item); 
  return arr;
});

// suggestion
const filteredResult = array1.filter(item => {
  // both ways work
  // return array2.every(x => x.obj2.ItemId !== item.ItemId); 
  return !array2.some(x => x.obj2.ItemId === item.ItemId); 
  });

console.log('initial result', test);
console.log('correct result', filteredResult);

【讨论】:

  • 我在上面回答了你的问题
  • 哦,它几乎可以工作了!实际上它可以工作但是当array2没有项目时它会返回一个错误
【解决方案2】:

试试这个

array1=array1.filter((item) => {
    return array2[0].obj2.ItemId !== item.ItemId;
})

【讨论】:

  • 如果 array2 有更多对象,我该如何处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2016-09-20
  • 1970-01-01
  • 2020-10-17
  • 2021-03-21
相关资源
最近更新 更多