gpt4 book ai didi

javascript - 在多个级别过滤嵌套的对象数组并取回数组中匹配的对象

转载 作者:行者123 更新时间:2023-12-04 07:56:46 25 4
gpt4 key购买 nike

我正在寻找修复我当前的函数,该函数搜索所有可能的匹配项并提供整个嵌套数组,但它仅适用于一个级别。
我正在尝试使用过滤器并通过循环搜索所有属性。
不知何故,它不适用于所有场景。

data = [
{
id: "m1",
name: "data1",
val: "D",
items: [
{
id: "d1",
name: "datanested1",
val: "D",
items: [
{
id: "1",
name: "direct Data",
val: "E"
},
{
id: "2",
name: "test",
val: "E"
}
]
}
]
},
{
id: "d2",
name: "data2",
val: "D",
items: [
{
id: "21",
name: "test21",
val: "E"
},
{
id: "22",
name: "test23",
val: "E"
}
]
},
{
id: "d3",
name: "data23",
val: "D",
items: [
{
id: "31",
name: "test data 3",
val: "E"
},
{
id: "32",
name: "test data 4",
val: "E"
}
]
}
];
function getFilteredData(searchText) {
return data.filter(item => {
return Object.keys(item).some(key => {
return String(item[key])
.toLowerCase()
.includes(searchText.toLowerCase());
});
});
}

console.log("data search level1", getFilteredData("data"));
//expected output
// [
// {
// id: "m1",
// name: "data1",
// val: "D",
// items: [
// {
// id: "d1",
// name: "datanested1",
// val: "D",
// items: [
// {
// id: "1",
// name: "direct Data",
// val: "E"
// },
// {
// id: "2",
// name: "B Data",
// val: "E"
// }
// ]
// }
// ]
// },
// {
// id: "d2",
// name: "data2",
// val: "D",
// items: [
// {
// id: "21",
// name: "test21",
// val: "E"
// },
// {
// id: "22",
// name: "test23",
// val: "E"
// }
// ]
// },
// {
// id: "d3",
// name: "data23",
// val: "D",
// items: [
// {
// id: "31",
// name: "test data 3",
// val: "E"
// },
// {
// id: "32",
// name: "test data 4",
// val: "E"
// }
// ]
// }
// ];
console.log("data search level2", getFilteredData("datanested1"));
//expected output
// {
// id: "m1",
// name: "data1",
// val: "D",
// items: [
// {
// id: "d1",
// name: "datanested1",
// val: "D",
// items: [
// {
// id: "1",
// name: "direct Data",
// val: "E"
// },
// {
// id: "2",
// name: "B Data",
// val: "E"
// }
// ]
// }
// ]
// }

console.log("data search level3", getFilteredData("direct"));
//expected output
// {
// id: "m1",
// name: "data1",
// val: "D",
// items: [
// {
// id: "d1",
// name: "datanested1",
// val: "D",
// items: [
// {
// id: "1",
// name: "direct Data",
// val: "E"
// },
// ]
// }
// ]
// }

console.log("data search level2 common", getFilteredData("test"));
//expected output
// [
// {
// id: "d2",
// name: "data2",
// val: "D",
// items: [
// {
// id: "21",
// name: "test21",
// val: "E"
// },
// {
// id: "22",
// name: "test23",
// val: "E"
// }
// ]
// },
// {
// id: "d3",
// name: "data23",
// val: "D",
// items: [
// {
// id: "31",
// name: "test data 3",
// val: "E"
// },
// {
// id: "32",
// name: "test data 4",
// val: "E"
// }
// ]
// }
// ];
console.log("data search level1 common", getFilteredData("2"));

// [
// {
// id: "m1",
// name: "data1",
// val: "D",
// items: [
// {
// id: "d1",
// name: "datanested1",
// val: "D",
// {
// id: "2",
// name: "test",
// val: "E"
// }
// ]
// }
// ]
// },
// {
// id: "d2",
// name: "data2",
// val: "D",
// items: [
// {
// id: "21",
// name: "test21",
// val: "E"
// },
// {
// id: "22",
// name: "test23",
// val: "E"
// }
// ]
// },
// {
// id: "d3",
// name: "data23",
// val: "D",
// {
// id: "32",
// name: "test data 4",
// val: "E"
// }
// ]
// }
// ];

下面是我正在尝试的stackblitz。
https://stackblitz.com/edit/js-1noseg

最佳答案

您可以使用一个接受数组或更高版本的函数 items并返回一个数组,其中包含包含所需值的对象,或者什么都不包含。

const
getFilteredData = (array, value) => array.reduce((r, o) => {
let { items = [], ...rest } = o,
values = Object.values(rest);
if (values.some(v => v.toString().includes(value))) {
r.push(o);
} else {
items = getFilteredData(items, value);
if (items.length) r.push({ ...o, items });
}
return r;
}, []),
data = [{ id: "m1", name: "data1", val: "D", items: [{ id: "d1", name: "datanested1", val: "D", items: [{ id: "1", name: "direct Data", val: "E" }, { id: "2", name: "test", val: "E" }] }] }, { id: "d2", name: "data2", val: "D", items: [{ id: "21", name: "test21", val: "E" }, { id: "22", name: "test23", val: "E" }] }, { id: "d3", name: "data23", val: "D", items: [{ id: "31", name: "test data 3", val: "E" }, { id: "32", name: "test data 4", val: "E" }] }],
testdata = [{ id: "d3", name: "data23", val: "D", items: [ { id: "31", name: "b", val: "E" }, { id: "32", name: "c", val: "E" } ] }];

console.log("data", getFilteredData(data, "data"));
console.log("datanested1", getFilteredData(data, "datanested1"));
console.log("direct", getFilteredData(data, "direct"));
console.log("test", getFilteredData(data, "test"));
console.log("2", getFilteredData(data, "2"));
console.log("testdata", getFilteredData(testdata, "b"));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 在多个级别过滤嵌套的对象数组并取回数组中匹配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66660780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com