【问题标题】:JS Filtering array of objects by another arrrays of objectsJS通过另一个对象数组过滤对象数组
【发布时间】:2019-07-18 04:43:04
【问题描述】:

我有三个对象数组:

const names = [
  { value: "Time" },
  { value: "Angle" },
  { value: "Speed" },
  { value: "Mass" }
];

const params = [
  { name: "Time", value: "s" },
  { name: "Time", value: "h" },
  { name: "Time", value: "m" },
  { name: "Angle", value: "rad" },
  { name: "Angle", value: "grade" }
];

const selected = [
  { id: 1, name: "Time", param: "s" },
  { id: 2, name: "Time", param: "h" },
  { id: 3, name: "Time", param: "m" },
  { id: 4, name: "Angle", param: "grade" },
  { id: 5, name: "Speed", param: null }
];

我需要没有以下项目的新名称数组:

  • 已选择所有可能的参数
  • 如果给定名称没有参数,则它只能选择一次

在这种情况下,我的预期输出应该是

    const expected = [
      { value: "Angle" }, 
      { value: "Mass" }
    ]

【问题讨论】:

  • 为什么不在所有这些中使用selected: true|false 标志,然后只使用Array.prototype.filter(...) 来过滤它们?

标签: javascript arrays object ecmascript-6 filter


【解决方案1】:

你可以过滤

  • 参数null 和
  • 没有一些价值
  • 过滤参数和选定项目的长度不相等且长度不同。

const
    names = [{ value: "Time" }, { value: "Angle" }, { value: "Speed" }, { value: "Mass" }],
    params = [{ name: "Time", value: "s" }, { name: "Time", value: "h" }, { name: "Time", value: "m" }, { name: "Angle", value: "rad" }, { name: "Angle", value: "grade" }],
    selected = [ { id: 1, name: "Time", param: "s" }, { id: 2, name: "Time", param: "h" }, { id: 3, name: "Time", param: "m" }, { id: 4, name: "Angle", param: "grade" }, { id: 5, name: "Speed", param: null }],
    result = names.filter(({ value }) => {
        const check = ({ name }) => name === value,
              pl = params.filter(check).length,
              sl = selected.filter(check).length;
  
        return !selected.some(o => o.name === value && o.param === null)
            && !(pl === sl && pl);
    });

console.log(result);

【讨论】:

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