亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在多級對象數組中查找值

如何在多級對象數組中查找值

繁星點點滴滴 2022-07-21 10:33:09
我正在嘗試實現一個搜索框,如果我開始在其中搜索一個值,它將在嵌套的對象數組中查找目標,如下所示:-[  {    "groupId": 1,    "groupName": "Americas",    "groupItems": [      {        "id": 5,        "name": "Brazil",        "parentID": 1,        "parentName": "Americas"      },      {        "id": 6,        "name": "Canada",        "parentID": 1,        "parentName": "Americas"      }    ],    "isExpanded": false,    "toggleAllSelection": false  },  {    "groupId": 2,    "groupName": "APAC",    "groupItems": [      {        "id": 7,        "name": "Australia",        "parentID": 2,        "parentName": "APAC"      },      {        "id": 8,        "name": "China",        "parentID": 2,        "parentName": "APAC"      }    ],    "isExpanded": false,    "toggleAllSelection": false  },  {    "groupId": 3,    "groupName": "Europe",    "groupItems": [      {        "id": 9,        "name": "Belgium",        "parentID": 3,        "parentName": "Europe"      },{        "id": 7,        "name": "Austria",        "parentID": 2,        "parentName": "APAC"      },      {        "id": 10,        "name": "Bulgaria",        "parentID": 3,        "parentName": "Europe"      }    ],    "isExpanded": false,    "toggleAllSelection": false  }]現在我想在數組中的每個對象數組中搜索name屬性。當有匹配時,我的函數應該以相同的格式返回數據,因為它將自動完成,所以它應該是部分匹配而不是完全匹配。所以如果在輸入框中搜索它應該返回groupItemsgroupaus[{    "groupId": 2,    "groupName": "APAC",    "groupItems": [      {        "id": 7,        "name": "Australia",        "parentID": 2,        "parentName": "APAC"      }],    "isExpanded": false,    "toggleAllSelection": false,},{    "groupId": 3,    "groupName": "Europe",    "groupItems": [       {        "id": 7,        "name": "Austria",        "parentID": 2,        "parentName": "APAC"      }    ],    "isExpanded": false,    "toggleAllSelection": false  }]
查看完整描述

3 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

const findByName = (data, name) => {

  const result = data.reduce((m, { groupItems, ...rest }) => {

    let mapGrpItems = (groupItems || []).filter((item) =>

      item.name.includes(name)

    );

    if (mapGrpItems.length) {

      m.push({ ...rest, groupItems: mapGrpItems });

    }

    return m;

  }, []);

  return result;

};

const findByName = (data, name) => {

  const result = data.reduce((m, { groupItems, ...rest }) => {

    let mapGrpItems = (groupItems || []).filter((item) =>

      item.name.includes(name)

    );

    if (mapGrpItems.length) {

      m.push({ ...rest, groupItems: mapGrpItems });

    }

    return m;

  }, []);

  return result;

};


const data = [{"groupId":1,"groupName":"Americas","groupItems":[{"id":5,"name":"Brazil","parentID":1,"parentName":"Americas"},{"id":6,"name":"Canada","parentID":1,"parentName":"Americas"}],"isExpanded":false,"toggleAllSelection":false},{"groupId":2,"groupName":"APAC","groupItems":[{"id":7,"name":"Australia","parentID":2,"parentName":"APAC"},{"id":8,"name":"China","parentID":2,"parentName":"APAC"}],"isExpanded":false,"toggleAllSelection":false},{"groupId":3,"groupName":"Europe","groupItems":[{"id":9,"name":"Belgium","parentID":3,"parentName":"Europe"},{"id":7,"name":"Austria","parentID":2,"parentName":"APAC"},{"id":10,"name":"Bulgaria","parentID":3,"parentName":"Europe"}],"isExpanded":false,"toggleAllSelection":false}]

console.log(JSON.stringify(findByName(data, "Aus"), null, 2));


查看完整回答
反對 回復 2022-07-21
?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

您可以將Arrays.filter用于 JSON 數組中每個外部對象中的組項目,以過濾掉與您的搜索查詢匹配的項目。你可以這樣寫:


let autocomplete = (key) => { 

  // arr = Your Data

  let result = []

  arr.forEach(grp=> {

  let out = grp

  let res = grp.groupItems.filter(item => item.name.toLowerCase().includes(key.toLowerCase()))

  if(res.length!=0)

  {

    out.groupItems = res

    result.push(out)}

})

return result


查看完整回答
反對 回復 2022-07-21
?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊

在實施此之前,我肯定會嘗試通過您嘗試做的事情進行推理。能夠通過這樣的解決方案進行推理是編程工作的 99%。


function filterGroups(filter) {

  const result = [];


  myObj.forEach(group => {

    const filteredGroups = group.groupItems.filter(groupItem => {

      return groupItem.name.toLowerCase().includes(filter);

    });


    if (filteredGroups.length > 1) {

      result.push({

        ...group,

        groupItems: filteredGroups

      });

    }

  });


  return result;

}


查看完整回答
反對 回復 2022-07-21
  • 3 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號