如何在JavaScript中从一个数组过滤另一个数组的对象?

时间:2020-09-28 13:35:58

标签: javascript arrays filter

我有两个数组:

let channelList = [
  {
    "channelId": 1,
    "channelName": "SMS"
  },
  {
    "channelId": 2,
    "channelName": "EMAIL"
  },
  {
    "channelId": 3,
    "channelName": "ANDROID"
  },
  {
    "channelId": 4,
    "channelName": "IOS"
  }
]

let promoList = [
  {
    "id": 124,
    "channelType": "SMS"
  },
  {
    "id": 125,
    "channelType": "ANDROID"
  },
  {
    "id": 126,
    "channelType": "IOS"
  }
]

我想要一个新的数组remainingChannels,其中有

{
    "channelId": 2,
    "channelName": "EMAIL"
}

因为它不在promoList中,但在channelList中存在。

我正在尝试使用如下过滤器操作来获取它:

for(let channel of this.promoDetailList) {
     remainingChannels = this.channelList.filter(e => {
         e.channelName == channel.channelType
     });
}

该怎么做?

3 个答案:

答案 0 :(得分:4)

您可以使用Array.filterArray.some

let channelList = [{"channelId":1,"channelName":"SMS"},{"channelId":2,"channelName":"EMAIL"},{"channelId":3,"channelName":"ANDROID"},{"channelId":4,"channelName":"IOS"}];

let promoList = [{"id":124,"channelType":"SMS"},{"id":125,"channelType":"ANDROID"},{"id":126,"channelType":"IOS"}]

//Check if the `channelName` from `channels` is matching with any of the
//`channelType` from `promos` list, negate the result. 
const filterData = (channels, promos) => channels.filter(channel => !promos.some(promo => promo.channelType === channel.channelName))

console.log(filterData(channelList, promoList));

这也可以使用Array.filterArray.find来实现。

let channelList = [{"channelId":1,"channelName":"SMS"},{"channelId":2,"channelName":"EMAIL"},{"channelId":3,"channelName":"ANDROID"},{"channelId":4,"channelName":"IOS"}];
let promoList = [{"id":124,"channelType":"SMS"},{"id":125,"channelType":"ANDROID"},{"id":126,"channelType":"IOS"}]

const filterData = (channels, promos) => channels.filter(({ channelName }) => !promos.find(({ channelType }) => channelName === channelType));

console.log(filterData(channelList, promoList))

答案 1 :(得分:1)

您可以使用Array.filter来做到这一点。

let channelList = [
  {
    "channelId": 1,
    "channelName": "SMS"
  },
  {
    "channelId": 2,
    "channelName": "EMAIL"
  },
  {
    "channelId": 3,
    "channelName": "ANDROID"
  },
  {
    "channelId": 4,
    "channelName": "IOS"
  }
]

let promoList = [
  {
    "id": 124,
    "channelType": "SMS"
  },
  {
    "id": 125,
    "channelType": "ANDROID"
  },
  {
    "id": 126,
    "channelType": "IOS"
  }
]

const result = channelList.filter(({channelName}) => {
  return promoList.filter(({ channelType }) => channelType === channelName).length == 0;
});
console.log(result);

答案 2 :(得分:0)

将其中一个数组的项目提取到字符串数组中。

  {
    $addFields: {
      date: {
        $cond: [
          { $gt: [{ $size: "$array" }, 0] },
          "date field", // your date field
          "$$REMOVE"
        ]
      }
    }
  }