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

问题描述

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

@H_404_6@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 }] }] } ] } }@H_502_9@

我想要达到的目标:

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

目前我们有:

@H_404_6@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);@H_502_9@

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

有什么好的解决办法吗?

解决方法

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

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 部分,但您可以将其扩展为包括所有必需的数据。