简体   繁体   English

JS通过另一个对象数组过滤对象数组

[英]JS Filtering array of objects by another arrrays of objects

I have three arrays of objects:我有三个对象数组:

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 }
];

I need new names array without items that:我需要没有项目的新名称数组:

  • have been selected with all possible params已选择所有可能的参数
  • if given name does not have param possible it can bo selected only once如果给定的名称没有可能的参数,则只能选择一次

in this case my expected output should be在这种情况下,我的预期输出应该是

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

You could filter by你可以过滤

  • not having some value with param null and没有一些参数为null
  • not having equal length of the filterd params and selected items and having a length.过滤参数和所选项目的长度不相等,并且具有长度。

 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM