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