【问题标题】:Filter array of objects by another array of objects with multiple keys通过具有多个键的另一个对象数组过滤对象数组
【发布时间】:2018-09-03 07:47:59
【问题描述】:

以下是我的代码。 “id”将具有相同的值。我想通过多个键过滤数据。过滤器未正常进行。

let myArray = [
    {
        "id": "#prodstck",
        "date": "2018-07-24T16:43:21Z"
    },
    {
        "id": "#prodstck",
        "date": "2018-04-24T16:43:42Z"
    },
];

let filterArray = [
    {
        "id": "#prodstck",
        "date": "2018-07-24T16:43:21Z"
    }
];

 const filterFeed = myArray.filter(obj=> filterArray.some((f: any) =>
            f.id !== obj.id && f.date !== obj.date
        ));

谢谢

【问题讨论】:

  • “过滤器没有正常运行。” 它应该做什么?它在做什么呢?
  • 它应该过滤并显示: [{ "id": "#prodstck", "date": "2018-04-24T16:43:42Z" }];但它显示为空,因为 id 相同。
  • 要改进/澄清问题,请使用“编辑”链接。
  • Re your accepted answer: find 不是正确的工具,some(您使用的函数)是。

标签: javascript filter


【解决方案1】:

这样的事情会返回带有 16:43:21 时间戳的项目。

let myArray = [
    {
        "id": "#prodstck",
        "date": "2018-07-24T16:43:21Z"
    },
    {
        "id": "#prodstck",
        "date": "2018-04-24T16:43:42Z"
    },
];

let filterArray = [
    {
        "id": "#prodstck",
        "date": "2018-07-24T16:43:21Z"
    }
];


const result = myArray.filter(item => {
	return filterArray.some(filterItem => item.id === filterItem.id && item.date === filterItem.date)  
})

console.log(result);

编辑:将 .find 更改为 .some 就像 OP 原来的那样。

【讨论】:

  • OP 的some,而不是find,在这种情况下是正确的函数。
【解决方案2】:

您的想法是正确的,只是您的some 条件不正确。应该是:

f.id === obj.id && f.date === obj.date

也就是说,当iddate 都与您的第二个数组中的一个条目匹配时,您希望some 返回true(以便filter 保留该条目)。

现场示例:

let myArray = [{
    "id": "#prodstck",
    "date": "2018-07-24T16:43:21Z"
  },
  {
    "id": "#prodstck",
    "date": "2018-04-24T16:43:42Z"
  },
];

let filterArray = [{
  "id": "#prodstck",
  "date": "2018-07-24T16:43:21Z"
}];

const filterFeed = myArray.filter(obj => filterArray.some((f/*: any*/) =>
  f.id === obj.id && f.date === obj.date
));

console.log(filterFeed);

【讨论】:

    【解决方案3】:

    你需要从回调函数中返回,条件会检查是否相等

    let myArray = [{
        "id": "#prodstck",
        "date": "2018-07-24T16:43:21Z"
      },
      {
        "id": "#prodstck",
        "date": "2018-04-24T16:43:42Z"
      },
    ];
    
    let filterArray = [{
      "id": "#prodstck",
      "date": "2018-07-24T16:43:21Z"
    }];
    
    const filterFeed = myArray.filter(function(obj) {
      return filterArray.some(function(f) {
        return f.id === obj.id && f.date === obj.date
      })
    });
    
    console.log(filterFeed)

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 2019-05-05
      • 2019-07-18
      • 2021-10-30
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2018-10-03
      相关资源
      最近更新 更多