繁体   English   中英

如果对象包含值存在于另一个数组中的属性,则过滤对象数组

[英]Filter array of objects if object contains attribute with value present in another array

我有以下对象数组。

const abc = [
      {
        sku: 1,
        features: ["Slim"],
        fields: [
          { label: "Material", value: "Material1" },
          { label: "Type", value: "Type1" },
        ]
      },
      {
        sku: 2,
        features: ["Cotton"],
        fields: [
          { label: "Material", value: "Material2" },
          { label: "Type", value: "Type1" },
        ]
      },
      {
        sku: 3,
        features: ["Cotton"],
        fields: [
          { label: "Material", value: "Material3" },
          { label: "Type", value: "Type2" },
        ]
      }
    ];

我只想过滤那些特征和字段值存在于这个中的对象

const fieldsArr = ["Material1", "Material2", "Type1", "Slim"]

预期输出为

let output = [
      {
        sku: 1,
        features: ["Slim"],
        fields: [
          { label: "Material", value: "Material1" },
          { label: "Type", value: "Type1" },
        ]
      },
      {
        sku: 2,
        features: ["Cotton"],
        fields: [
          { label: "Material", value: "Material2" },
          { label: "Type", value: "Type1" },
        ]
      },
    ]

我解决了这样的功能部分

abc.forEach(e => {
      if (e.features.some(v => fieldsArr.indexOf(v) !== -1)) {
        output.push(e);
      }
    });

但是我在过滤字段部分时遇到了问题。 有没有办法以优化的方式根据上述条件过滤对象。

您还需要迭代嵌套数组。

 const abc = [{ sku: 1, features: ["Slim"], fields: [{ label: "Material", value: "Material1" }, { label: "Type", value: "Type1" }] }, { sku: 2, features: ["Cotton"], fields: [{ label: "Material", value: "Material2" }, { label: "Type", value: "Type1" }] }, { sku: 3, features: ["Cotton"], fields: [{ label: "Material", value: "Material3" }, { label: "Type", value: "Type2" }] }], fieldsArr = ["Material1", "Material2", "Type1", "Slim"], result = abc.filter(({ features, fields }) => features.some(v => fieldsArr.includes(v)) || fields.some(({ value }) => fieldsArr.includes(value)) ); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

使用过滤器,并使用fieldsArr检查每个项目的featuresfields (值)的组合值。

 const abc = [ { sku: 1, features: ["Slim"], fields: [ { label: "Material", value: "Material1" }, { label: "Type", value: "Type1" } ] }, { sku: 2, features: ["Cotton"], fields: [ { label: "Material", value: "Material2" }, { label: "Type", value: "Type1" } ] }, { sku: 3, features: ["Cotton"], fields: [ { label: "Material", value: "Material3" }, { label: "Type", value: "Type2" } ] } ]; const fieldsArr = ["Material1", "Material2", "Type1", "Slim"]; const res = abc.filter(item => [...item.features, ...item.fields.map(x => x.value)].some(fea => fieldsArr.includes(fea) ) ); console.log(res); // Update: more concise using destructure const res2 = abc.filter(({features, fields}) => [...features, ...fields.map(({value}) => value)].some(fea => fieldsArr.includes(fea) ) ); console.log(res2);

暂无
暂无

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

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