繁体   English   中英

搜索/过滤嵌套数组Javascript / Lodash

[英]Search/Filter nested Array Javascript/Lodash

对于我的React.js项目,我想创建一个嵌套数组的搜索过滤器。 用户将在输入字段中进行搜索。

    var dataExample = [
  {
    type: "human", details: [
    {id: 1, name: "Peter", description: "friendly, black-hair"},
    {id: 5, name: "Susan", description: "blond"}
      ]
  },

  {
    type: "animal", details: [
    {id: 2, name: "Will", description: "lazy, cute"},
    {id: 3, name: "Bonny", description: "beautiful"}
      ]
  }
];

我想在搜索输入字段中查找“名称” “描述”中的内容。 数组的数据结构应保持不变。

当我搜索“ friendly” “ Peter”时,输出应为:

[
  {
    type: "human", details: [
    {id: 1, name: "Peter", description: "friendly, black-hair"}
      ]
  }
];

现在我尝试了这样的事情:

  let myfilter = dataExample.filter((data) => {
  data.details.filter((items) => {
    return (items.type.indexOf("human") !== -1 ||       //input of user
              items.description.indexOf("friendly"))
  })
})

不幸的是,这不是它的工作方式。 有谁能够帮助我? Lodash也没问题。 非常感谢。

这是一些没有lodash的示例。

  var dataAll = [
        {
            type: "human",
            details: [
                {id: 1, name: "Peter", description: "friendly, black-hair"},
                {id: 5, name: "Susan", description: "blond"}
            ]
        },
        {
            type: "animal",
            details: [
                {id: 2, name: "Will", description: "lazy, cute"},
                {id: 3, name: "Bonny", description: "beautiful"}
            ]
        }
    ];

    var entryTypeFilter = data => data.type.indexOf("hum") !== -1;
    var entryDetailDescFilter = data => data.description.indexOf("friend") !== -1;
    var entryDetailsMapper = data => {
        return {
            type: data.type,
            details: data.details.filter(entryDetailDescFilter)
        };
    };
    var entryNoDetailsFilter = data => data.details && data.details.length !== 0;

    var dataFilteredByType = dataAll.filter(entryTypeFilter);
    var dataFilteredByDesc = dataAll.map(entryDetailsMapper);
    var dataFilteredByTypeAndDesc = dataAll.filter(entryTypeFilter).map(entryDetailsMapper);
    var dataFilteredByDescTrimmingEmptyDetailEntries = dataAll.map(entryDetailsMapper).filter(entryNoDetailsFilter);
  • 在现代javascript中,您可能需要搜索如何将...关键字用于映射回调函数。

您可以将array#reducearray#filter并且可以使用string#incldues来检查您的单词。

 const dataExample = [ { type: "human", details: [ {id: 1, name: "Peter", description: "friendly, black-hair"}, {id: 5, name: "Susan", description: "blond"} ] }, { type: "animal",details: [ {id: 2, name: "Will", description: "lazy, cute"}, {id: 3, name: "Bonny", description: "beautiful"} ] } ], term = 'Peter', result = dataExample.reduce((r, {type,details}) => { let o = details.filter(({name,description}) => name.includes(term) || description.includes(term)); if(o && o.length) r.push({type, details : [...o]}); return r; },[]); console.log(result); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM