微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Array - 获取所有与级别无关的字段项

如何解决Array - 获取所有与级别无关的字段项

假设我有一个这样的数组:

const data = {
  id: "helloworld",type: "Collection",_embedded: {
    items: [{
        fields: [{
          id: "bla",fields: [{
            id: "nice",value: 100
          }]
        },{
          id: "no",fields: [{
            id: "js",value: true
          }]
        }]

      },{
        fields: [{
          id: "od",fields: [{
            id: "adeb",value: 456
          }]
        },{
          id: "def",fields: [{
            id: "frft",value: 77
          }]
        }]

      }

    ]
  }
}

我想要达到的目标:

-获取 fields 数组中所有项目的扁平化列表。所以最后我需要有一个列表,其中包含字段数组中的每个项目。 - 解决方案应该是独立的水平。所以要真正找到fields数组的所有项,应该越来越深入。

目前我们有:

const flattenedProductFieldsList = data?._embedded?.items
        .flat(2)
        .map((el) => el.fields)
        .filter((el) => el)
        .flat(2)
        .map((el) => el._embedded)
        .filter((el) => el)
        .flat(2)
        .filter((el) => el)
        .map((el) => el.items)
        .filter((el) => el)
        .flat(2)
        .map((el) => el.fields)
        .filter((el) => el)
        .flat(2);

但这当然不好,因为我们仅限于特定的层次结构级别。而且这种扁平化一点也不好看。

有什么好的解决办法吗?

解决方法

你可以试试递归函数。由于您尚未指定有关特定订单的任何内容,因此它可能适合您的需要。不过,对于庞大的数据集,这可能会带来问题。

const result = [];

function extract(dataSet)
     dataSet.forEach(elem => {
         if (Object.keys(elem).includes("fields")) {
             extract(elem.fields);
         }
         if (Object.keys(elem).includes("value")) {
             result.push(elem.value);
         }
     }
}

extract(data._embedded.items);
console.log(result);

我只在结果数组中添加了每个级别的 value 部分,但您可以将其扩展为包括所有必需的数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。