Javascript通过包含搜索词的标签子数组过滤或减少每个JSON对象

Posted

技术标签:

【中文标题】Javascript通过包含搜索词的标签子数组过滤或减少每个JSON对象【英文标题】:Javascript Filter or Reduce each JSON object by child array of tags which contains search word 【发布时间】:2019-03-17 16:10:21 【问题描述】:

我需要有关通过子数组属性在给定的 javascript 对象数组下面进行过滤的帮助。

我有一个反应应用程序,当用户在搜索框中键入字符串时,我想在其中过滤文章,但我的问题与仅通过它的子数组值过滤对象有关。

// 我的 JSON 对象

this.state = 
 articles: [
    title: 'title 1', tags :["JavaScript", "ES6"], category: "JavaScript",
    title: 'title 2', tags :["React", "TypeScript"], category: "React",
    title: 'title 3', tags :["JavaScript", "Inheritance", "Prototype"], category: "JavaScript"
 ]
;

//需要输出

// If user start typing in searchbox like "jav" then it should filter only those items which tags name matching with "jav". Tags is an Array

 [
    title: 'title 1', tags :["JavaScript", "ES6"], category: "JavaScript",
    title: 'title 3', tags :["JavaScript", "Inheritance", "Prototype"], category: "JavaScript"
 ]

我试过下面给出的代码,但没有给出正确的结果:

this.state.articles.reduce((newArticles: any, article: any) => 
            // let test1 = [];
            if (article.tags) 
                article.tags.map(tag => 
                    if (tag && tag.toLowerCase().indexOf(event.target.value) === -1) 
                        newArticles.push(article);
                        // return article;
                    
                );
             else 
                // newArticles.push(article);
            

            console.log('test1 =', newArticles);
            return newArticles;
        , []);

如果我的问题不清楚或需要更多信息,请告诉我。

谢谢, 吉涅什·拉瓦尔

【问题讨论】:

【参考方案1】:

您可以在内部使用filter 方法执行此操作,检查some 标签includes 是否是您要搜索的字符串的一部分。

let articles = [title: 'title 1', tags :["JavaScript", "ES6"], category: "JavaScript",title: 'title 2', tags :["React", "TypeScript"], category: "React",title: 'title 3', tags :["JavaScript", "Inheritance", "Prototype"], category: "JavaScript"]
 
let search = 'java';
let result = articles.filter((tags) => 
  return tags.some(e => e.toLowerCase().includes(search.toLowerCase()))
)

console.log(result)

【讨论】:

【参考方案2】:

您可以在内部使用filter 方法执行此操作,检查某个标签是否包含您要搜索的部分字符串。

let articles = [title: 'title 1', tags :["JavaScript", "ES6"], category: "JavaScript",title: 'title 2', tags :["React", "TypeScript"], category: "React",title: 'title 3', tags :["JavaScript", "Inheritance", "Prototype"], category: "JavaScript"]

let search = "ES";
let result = articles.filter(((data)=>data.tags.some(v => v.includes(search))))

console.log(result)

【讨论】:

【参考方案3】:

我认为这是解决方案。您有不必要的元素的事实是,您只检查了属性children 是否有值而不是undefined。使用检查 node.children.length > 0 检查数组是否至少有 1 个项目。

    // the filter

const nodes = $.grep(data, function f(node) 
    const nodeIncludesValue = node.name.toLowerCase().includes(value);

    if (node.children && node.children.length > 0) 
        return $.grep(node.children, f) || nodeIncludesValue;
       

    return nodeIncludesValue;
);



// No unnecessary elements

createTree(nodes, container)

    const list = document.createElement('ul');

    nodes.forEach((node) => 
        const listItem = document.createElement('li');
        listItem.textContent = node.name;
        list.appendChild(listItem);

        if (node.children && node.children.length > 0) 
            const childList = document.createElement('li');
            this.createTree(node.children, childList);
            list.appendChild(childList);
        
    );

    container.appendChild(list);

希望这对你有帮助:)

【讨论】:

以上是关于Javascript通过包含搜索词的标签子数组过滤或减少每个JSON对象的主要内容,如果未能解决你的问题,请参考以下文章

Swift SearchBar 过滤和更新多个数组

使用子字符串作为条件过滤子文档数组

带有几个可选搜索词的参数化查询

NHibernate 查询:包含在父属性或子属性中的字符串

通过子字符串快速过滤字符串集合?

数组 - Javascript - 使用输入搜索过滤对象数组