我有一個 json 物件,如下所示:
[
{
name: 'data 1',
users: [
{
username: 'user 1',
full_name: 'name 1',
sources: [
{ type: 'type 1', name: 'source name 1' },
{ type: 'type 2', name: 'source name 2' },
],
},
{
username: 'user 2',
full_name: 'name 2',
sources: [
{ type: 'type 3', name: 'source name 3' },
{ type: 'type 4', name: 'source name 4' },
],
},
],
},
{
name: 'data 2',
users: [
{ username: 'user 3', full_name: 'name 3' },
{
username: 'user 4',
full_name: 'name 4',
sources: [
{ type: 'type 5', name: 'source name 3' },
{ type: 'type 6', name: 'source name 5' },
],
},
],
},
{
name: 'data 3',
users: [
{ username: 'user 5', full_name: 'name 5' },
{
username: 'user 6',
full_name: 'name 6',
sources: [
{ type: 'type 5', name: 'source name 6' },
{ type: 'type 6', name: 'source name 7' },
],
},
],
},
];
我需要一個函式來遞回過濾資料的所有值。例如,當我輸入“data 1”時,它應該回傳一個陣列,例如
[
{
name: 'data 1',
users: [
{
username: 'user 1',
full_name: 'name 1',
sources: [
{ type: 'type 1', name: 'source name 1' },
{ type: 'type 2', name: 'source name 2' },
],
},
{
username: 'user 2',
full_name: 'name 2',
sources: [
{ type: 'type 3', name: 'source name 3' },
{ type: 'type 4', name: 'source name 4' },
],
},
],
},
];
或者如果我輸入“源名稱 3”,它應該將“資料 1”和“資料 2”物件作為陣列回傳。
json 物件的值中可能有更多的陣列或物件。我試過這樣的事情,但它回傳所有資料而不是過濾資料。
function search(data) {
return data.filter((data) => {
Object.values(data).some((value) =>
value.constructor.name === 'Array'
? search(value)
: value.constructor.name === 'Object'
? Object.values(value).some((innerValue) =>
innerValue.toString().toLowerCase().includes(searchValue)
)
: value.toString().toLowerCase().includes(searchValue)
);
});
}
如果我必須通過某個特定的鍵來做到這一點,那會很容易,但我必須按所有鍵動態過濾。我應該怎么做才能過濾這樣的 json 物件?
uj5u.com熱心網友回復:
您可以采用遞回方法。通過擁有一個物件,它也會迭代這些值。
const
has = value => object => Object
.values(object)
.some(v => v === value || v && typeof v === 'object' && has(value)(v)),
filter = (array, value) => array.filter(has(value)),
data = [{ name: 'data 1', users: [{ username: 'user 1', full_name: 'name 1', sources: [{ type: 'type 1', name: 'source name 1' }, { type: 'type 2', name: 'source name 2' }] }, { username: 'user 2', full_name: 'name 2', sources: [{ type: 'type 3', name: 'source name 3' }, { type: 'type 4', name: 'source name 4' }] }] }, { name: 'data 2', users: [{ username: 'user 3', full_name: 'name 3' }, { username: 'user 4', full_name: 'name 4', sources: [{ type: 'type 5', name: 'source name 3' }, { type: 'type 6', name: 'source name 5' }] }] }, { name: 'data 3', users: [{ username: 'user 5', full_name: 'name 5' }, { username: 'user 6', full_name: 'name 6', sources: [ { type: 'type 5', name: 'source name 6' }, { type: 'type 6', name: 'source name 7' }] }] }];
console.log(filter(data, 'data 1'));
console.log(filter(data, 'source name 3'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/375101.html
標籤:javascript 数组 递归 javascript对象
上一篇:我如何解決方程上的遞回樹問題
下一篇:創建一個接受任意數量函式的函式
