如何按值過濾嵌套的對像數組並獲取根對象

奧克泰·唐梅茲

我有一個 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 對象?

尼娜·舒爾茨

您可以採用遞歸方法。通過擁有一個對象,它也會迭代這些值。

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; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在對像數組中搜索一個值並在 Laravel 中獲取它?

如何根據兩個數組獲取匹配計數的對象

過濾複雜對像中的數組數組並返回該對象

如何按對象鍵過濾對像數組?

如何根據特定對象過濾對像數組?

如何在javascript中過濾嵌套對象屬性並打印新對象

按數組字符串過濾對像數組並與對象的子字符串匹配

從對像數組中組合未知的對象子數組並對其進行過濾

是否可以總結對像數組的屬性並根據另一個屬性對其進行過濾?

在 React 中根據多個條件過濾對像數組

如何根據對象的值將對像數組拆分為另一個數組?

如何在要解析的嵌套對像數組中獲取 RxJs Observable 的值?

按子項過濾並在嵌套的對像數組中返回父項和子項

在 React 中的對像數組中返回過濾後的嵌套數組

JQ根據鍵值獲取唯一的對象和數組

從數組中過濾對象並選擇字段

如何使用mongo查詢獲取對像數組的特定對象?

如何在嵌套的對像數組中獲取對象路徑?

根據其他對像數組的值動態分配對象屬性

如何通過對像數組映射以提取對象值?

如何過濾對像數組並根據另一個數組過濾掉值?過濾應該基於鍵而不是值

按值過濾對象

組對象,獲取計數

如何根據鍵過濾對象的數據並使新數組做出反應?

根據 id 數組過濾對像數組中的 id

在 JavaScript 中通過鍵和嵌套值過濾對像數組

帶有要過濾的嵌套數組的對象,想要返回帶有新過濾數組的整個對象

按 id 過濾數組對象 - REACT

我如何通過嵌套對像數組創建具有嵌套對像數組的對象