首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在嵌套数组中查找多个元素

在嵌套数组中查找多个元素
EN

Stack Overflow用户
提问于 2019-06-04 05:46:00
回答 3查看 779关注 0票数 1

我需要在嵌套数组中找到多个元素,并将其作为数组返回。

我使用reduce函数查找元素,但它只返回一个记录。

嵌套数组:

代码语言:javascript
复制
{
    "type": "group",
    "level": 0,
    "expand": "-closed",
    "selected": false,
    "text": "Федулов Владислав Владиславович",
    "phoneNumber": "+7 (927) 999 9999",
    "email": "qweeqwe@mail.ru",
    "id": 24,
    "parent": null,
    "cardType": 0,
    "childrens": [
      {
        "type": "group",
        "level": 1,
        "expand": "-closed",
        "selected": false,
        "text": "Ширяев Феликс Богуславович",
        "phoneNumber": "+7 (123) 456 7810",
        "email": "test@test.ru",
        "id": 47,
        "parent": 24,
        "cardType": 0,
        "childrens": [
          {
            "type": "manager",
            "level": 2,
            "expand": "-empty",
            "selected": false,
            "text": "Колесова Анастасия Олеговна",
            "phoneNumber": "+7 (900) 000 0001",
            "email": "eprosvirina@baccasoft.ru",
            "id": 58,
            "parent": 47,
            "cardType": 0,
            "childrens": null
          }
        ]
      }
    ]
  },
  {
    "type": "group",
    "level": 0,
    "expand": "-closed",
    "selected": false,
    "text": "Игнатьева Женевьева Павловна",
    "phoneNumber": "+7 (777) 777 7777",
    "email": "igp@sks.ru",
    "id": 3,
    "parent": null,
    "cardType": 0,
    "childrens": [
      {
        "type": "group",
        "level": 1,
        "expand": "-closed",
        "selected": false,
        "text": "Меретин Викентий Васильевич",
        "phoneNumber": "+7 (917) 193 5222",
        "email": "keshman@gmail.com",
        "id": 2,
        "parent": 3,
        "cardType": 1,
        "childrens": [
          {
            "type": "manager",
            "level": 2,
            "expand": "-empty",
            "selected": false,
            "text": "Климаков Алексей Александрович",
            "phoneNumber": "+7 (903) 888 8888",
            "email": "krenog@gmail.com",
            "id": 20,
            "parent": 2,
            "cardType": 1,
            "childrens": null
          }
        ]
      }
    ]
  }

reduce函数:

代码语言:javascript
复制
    var array = store.managersTree.treeNodes;
    var items = [];

    const findItemNested = (arr, searchString, nestingKey) => (
    arr.reduce((a, item) => {
         if (a) return a;
         if (item.text.indexOf(searchString)!==-1 || 
             item.phoneNumber.indexOf(searchString)!==-1 || 
             item.email.indexOf(searchString)!==-1) return item;
         if (item[nestingKey]) return findItemNested(item[nestingKey], 
       searchString, nestingKey)
    }, [])
    );

    const element = findItemNested(array, searchString, "childrens");

我正在试图找到一个匹配至少一个条件的记录,期望reduce返回多个记录,但这只返回一个记录,尽管找到了多个记录。

任何帮助都将不胜感激。

UPD:searchString可以是字符串,如phoneNumbertextemail

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-04 06:25:19

您可以递归地reduce数组。

  • 变形结构 reduce参数中的对象以分别获取nestingKey和其他属性
  • 创建一个filterKeys数组,其中包含要搜索searchString的键。
  • 使用some检查对象中的任何字段是否有includes searchString的值。
  • 如果存在nestingKey,则可以将嵌套项推送到累加器数组。

代码语言:javascript
复制
const input=[{"type":"group","level":0,"expand":"-closed","selected":false,"text":"Федулов Владислав Владиславович","phoneNumber":"+7 (927) 999 9999","email":"qweeqwe@mail.ru","id":24,"parent":null,"cardType":0,"childrens":[{"type":"group","level":1,"expand":"-closed","selected":false,"text":"Ширяев Феликс Богуславович","phoneNumber":"+7 (123) 456 7810","email":"test@test.ru","id":47,"parent":24,"cardType":0,"childrens":[{"type":"manager","level":2,"expand":"-empty","selected":false,"text":"Колесова Анастасия Олеговна","phoneNumber":"+7 (900) 000 0001","email":"eprosvirina@baccasoft.ru","id":58,"parent":47,"cardType":0,"childrens":null}]}]},{"type":"group","level":0,"expand":"-closed","selected":false,"text":"Игнатьева Женевьева Павловна","phoneNumber":"+7 (777) 777 7777","email":"igp@sks.ru","id":3,"parent":null,"cardType":0,"childrens":[{"type":"group","level":1,"expand":"-closed","selected":false,"text":"Меретин Викентий Васильевич","phoneNumber":"+7 (917) 193 5222","email":"keshman@gmail.com","id":2,"parent":3,"cardType":1,"childrens":[{"type":"manager","level":2,"expand":"-empty","selected":false,"text":"Климаков Алексей Александрович","phoneNumber":"+7 (903) 888 8888","email":"krenog@gmail.com","id":20,"parent":2,"cardType":1,"childrens":null}]}]}],
    filterKeys = ["text", "phoneNumber", "email"];

function findItemNested(array, searchString, nestingKey) {
  return array.reduce((acc, { [nestingKey]: nested, ...o }) => {
    if (filterKeys.some(k => o[k] && o[k].includes(searchString)))
      acc.push(o)
      
    if (nested)
      acc.push(...findItemNested(nested, searchString, nestingKey)) 
      
    return acc;
  }, [])
}

console.log(findItemNested(input, "keshman", "childrens"))
console.log(findItemNested(input, "@gmail.com", "childrens"))

票数 3
EN

Stack Overflow用户

发布于 2019-06-04 05:55:59

始终在处理数组中的每个元素后,Array.reduce返回一个值。如果要返回数组中的匹配记录,则可以使用,Array.filter,

代码语言:javascript
复制
[1,2,3,4,5].filter((element) => {
    return (element === 2 || element ===4);
});

对于上面的代码,过滤后的数组将是,

代码语言:javascript
复制
[2,4]

在筛选之前,您应该平铺数组,或者遍历每个元素来过滤数组,而不是使用Array.filter()

票数 0
EN

Stack Overflow用户

发布于 2019-06-04 06:48:44

如果不减少它的可能性,

代码语言:javascript
复制
var s = [{
    "type": "group",
    "level": 0,
    "expand": "-closed",
    "selected": false,
    "text": "Федулов Владислав Владиславович",
    "phoneNumber": "+7 (927) 999 9999",
    "email": "qweeqwe@mail.ru",
    "id": 24,
    "parent": null,
    "cardType": 0,
    "childrens": [
      {
        "type": "group",
        "level": 1,
        "expand": "-closed",
        "selected": false,
        "text": "Ширяев Феликс Богуславович",
        "phoneNumber": "+7 (123) 456 7810",
        "email": "test@test.ru",
        "id": 47,
        "parent": 24,
        "cardType": 0,
        "childrens": [
          {
            "type": "manager",
            "level": 2,
            "expand": "-empty",
            "selected": false,
            "text": "Колесова Анастасия Олеговна",
            "phoneNumber": "+7 (900) 000 0001",
            "email": "eprosvirina@baccasoft.ru",
            "id": 58,
            "parent": 47,
            "cardType": 0,
            "childrens": null
          },
          {
            "type": "group",
            "level": 2,
            "expand": "-empty",
            "selected": false,
            "text": "Колесова Анастасия Олеговна",
            "phoneNumber": "+7 (900) 000 0001",
            "email": "eprosvirina@baccasoft.ru",
            "id": 534,
            "parent": 47,
            "cardType": 0,
            "childrens": null
          },
          {
            "type": "manager",
            "level": 2,
            "expand": "-empty",
            "selected": false,
            "text": "Колесова Анастасия Олеговна",
            "phoneNumber": "+7 (900) 000 0001",
            "email": "eprosvirina@baccasoft.ru",
            "id": 523,
            "parent": 47,
            "cardType": 0,
            "childrens": null
          }
        ]
      }
    ]
  },
  {
    "type": "manager",
    "level": 0,
    "expand": "-closed",
    "selected": false,
    "text": "Игнатьева Женевьева Павловна",
    "phoneNumber": "+7 (777) 777 7777",
    "email": "igp@sks.ru",
    "id": 3,
    "parent": null,
    "cardType": 0,
    "childrens": [
      {
        "type": "group",
        "level": 1,
        "expand": "-closed",
        "selected": false,
        "text": "Меретин Викентий Васильевич",
        "phoneNumber": "+7 (917) 193 5222",
        "email": "keshman@gmail.com",
        "id": 2,
        "parent": 3,
        "cardType": 1,
        "childrens": [
          {
            "type": "manager",
            "level": 2,
            "expand": "-empty",
            "selected": false,
            "text": "Климаков Алексей Александрович",
            "phoneNumber": "+7 (903) 888 8888",
            "email": "krenog@gmail.com",
            "id": 20,
            "parent": 2,
            "cardType": 1,
            "childrens": null
          }
        ]
      }
    ]
  }];

  function filterRequiredElement(arr, searchString, nestingKey) {
      arr.forEach((item, index) => {
          if (item.type !== searchString || item.phoneNumber !== searchString || item.email !== searchString) {
             arr.splice(index, 1);
          }
      });
      for(let item of arr) {
          if (item[nestingKey] !== null) {
              filterRequiredElement(item[nestingKey], searchString, nestingKey);
          }
      }
  }

  filterRequiredElement(s ,'Климаков Алексей Александрович', 'childrens');
  console.log(s);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56437956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档