【问题标题】:Filtering an array of values by array of object's value按对象值数组过滤值数组
【发布时间】:2020-04-19 12:42:56
【问题描述】:

在 Javascript 中我们有一个数组:

let arr1 = [1, 2, 3, 4, 5];

...和一个对象数组:

let arr2 = [ {name: "banana", id: 1},
             {name: "mango", id: 3} ];

我想从arr1 中删除所有元素,其中arr2 的 id = arr1 的值并返回如下数组:

[2, 4, 5]

这是我尝试过的方法,但它似乎不起作用。

let newArr = arr1.filter(
    x => !arr2.includes(e => e.id === x)
)

我怎样才能做到这一点?我可以使用lodash 以及 ES6。

【问题讨论】:

  • 你的尝试是什么?

标签: javascript ecmascript-6 lodash


【解决方案1】:

.includes() 方法不允许您将方法传递给它来定义相等性。你可以改用.some(),它允许你指定这个:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [
  {name: "banana", id: 1},
  {name: "mango", id: 3}
];

const newArr = arr1.filter(x => !arr2.some(e => e.id === x))
console.log(newArr);

一种更有效的方法是从数组中的对象中获取所有id 属性,然后放入Set 中以便快速查找。然后像这样使用.filter().has()

const arr1 = [1, 2, 3, 4, 5];
const arr2 = [
  {name: "banana", id: 1},
  {name: "mango", id: 3}
];

const idSet = new Set(arr2.map(({id}) => id));
const newArr = arr1.filter(x => !idSet.has(x))
console.log(newArr);

【讨论】:

    【解决方案2】:

    你可以先创建一个idage的临时值,然后使用filter()includes()

    let arr1 = [1, 2, 3, 4, 5];
    let arr2 = [ {name: "banana", id: 1},
             {name: "mango", age: 3} ];
    let temp = arr2.map(i => i.id || i.age);
    let res = arr1.filter(i => !temp.includes(i));
    console.log(res);

    【讨论】:

      【解决方案3】:
      let arr1 = [1, 2, 3, 4, 5];
      
      let arr2 = [ {name: "banana", id: 1},
                   {name: "mango", id: 3} ];
      
      arr1.map((item,index) => 
        arr2.map(object => {
          if(item == object.id) arr1.splice(index,1)
        })
      )
      
      console.warn(arr1) /// output [2, 4, 5]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-23
        • 2019-05-04
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多