【问题标题】:Sort Array of strings on characters and return all matching elements按字符对字符串数组进行排序并返回所有匹配的元素
【发布时间】:2020-08-22 22:09:16
【问题描述】:

我有一个对象数组

var carList = [
    {
        car: "maruti",
        colors: ["red", "redish","yellow"]
    },
    {
        car: "ferrari",
        colors: ["purple", "red"]
    },
    {
        car: "Merc",
        colors: ["pink", "green"]
    }
];

现在我有一个输入搜索字段,用户可以在其中输入汽车的颜色。 因此,如果用户键入 red 则只应返回 marutiferrari 对象。 如果用户键入 reddish 则只应返回 maruti 对象。

我尝试使用嵌套过滤器

var textToSearch = "re";  
var test = carList.filter((x) => x.colors.filter((y)=> y.indexOf("textToSearch") > -1) );

即使搜索字符串只有 2 个字符,例如“re”,它也应该返回 maruti 和 ferrari 作为输出。

但这会返回所有对象,而不仅仅是 maruti 和 ferrari

注意:我希望它应该返回所有匹配的元素,而不仅仅是第一个匹配的元素。

【问题讨论】:

    标签: javascript arrays sorting data-structures ecmascript-6


    【解决方案1】:

    filter() 中使用includes()some() 来检查textToSearch 是否存在于colors 数组中:

    var textToSearch = "r";
    var test = carList.filter(x => x.colors.some(cl => cl.includes(textToSearch)));
    console.log(test);
    

    var carList = [{
        car: "maruti",
        colors: ["red", "redish", "yellow"]
      },
      {
        car: "ferrari",
        colors: ["purple", "red"]
      },
      {
        car: "Merc",
        colors: ["pink", "green"]
      }
    ];
    
    var textToSearch = "re";
    var test = carList.filter(x => x.colors.some(cl => cl.includes(textToSearch)));
    console.log(test);

    注意:您必须谨慎使用这种方法,因为re 匹配green
    根据评论:

    var carList = [{
        car: "maruti",
        colors: ["red", "redish", "yellow"]
      },
      {
        car: "ferrari",
        colors: ["purple", "red"]
      },
      {
        car: "Merc",
        colors: ["pink", "green"]
      }
    ];
    
    function getCars(event) {
    
      // Value of input field
      var value = event.target.name;
      
      // Sort carList
      var res = carList.filter(x => x.colors.some(cl => cl.includes(value)));
      
      // Show result to console
      console.log(res);
    }
    <input onclick="getCars(event);" name="red" type="checkbox">red</input>
    <input onclick="getCars(event);" name="llow" type="checkbox">llow</input>

    【讨论】:

    • 感谢您的回复...但我想要这样即使搜索字符串只有 2 个字符(如 re),它也应该返回 maruti 和 ferrari 作为输出。仅当用户将完整字符串键入为“red”而不是“re”时,您的答案才会返回值。你能修改你的答案吗..
    • @Rakesh 我已经更新了我的答案。下一个问题的提示;慢慢来,以便在发布问题时列出问题的所有部分。
    • 谢谢,一切正常。但还有一个问题。我可以使这个动态( carList.filter(({colors}) => )我希望我可以从外部传递变量而不是硬编码的颜色,例如用户单击的 fieldName。如果用户单击颜色输入字段过滤器数组如果用户单击汽车输入字段,则应按颜色过滤过滤器数组应使用汽车对象。这可能吗,还是我必须为每个字段编写单独的代码?
    • 很高兴它成功了。您应该accept/upvote the answer thats helped you the most 以便其他用户可以轻松找到相同的解决方案。关于第二个问题,我想您应该就此提出另一个问题。也就是说,您可以使用 javascript 来获取用户填充的值,并将其传递给 includes 函数。
    • 我已经赞成你的回答,再次感谢...你能提供一个小的 sn-p 代码来动态获取值而不是硬编码的颜色对象吗?
    【解决方案2】:

    您可以使用过滤器和some。在filter 回调中使用一些来获取包含搜索到的颜色的颜色

    var carList = [{
        car: "maruti",
        colors: ["red", "redish", "yellow"]
      },
      {
        car: "ferrari",
        colors: ["purple", "red"]
      },
      {
        car: "Merc",
        colors: ["pink", "green"]
      }
    ]
    
    function getCar(color) {
      return carList.filter(item => item.colors.some(col => col.includes(color)))
    }
    console.log(' When it is red ', getCar('red'));
    console.log('When it is redish', getCar('redish'));

    【讨论】:

    • 感谢您的回复...但我想要这样即使搜索字符串只有 2 个字符(如 re),它也应该返回 maruti 和 ferrari 作为输出。仅当用户将完整字符串键入为“red”而不是“re”时,您的答案才会返回值。你能修改你的答案吗..
    【解决方案3】:

    两个问题:

    1. 函数filter总是返回一个数组,即truthy值。
    2. 变量textToSearch 有错字,用双引号括起来。

    我建议您改用函数some 和函数includes

    let carList = [{    car: "maruti",    colors: ["red", "redish","yellow"]},{    car: "ferrari",    colors: ["purple", "red"]},{    car: "Merc",    colors: ["pink", "green"]}],
        textToSearch = "ed",
        fieldName = "colors",
        test = carList.filter((c) => c[fieldName].some(c => c.includes(textToSearch)));
        
    console.log(test)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 感谢您的回复...但我想要这样即使搜索字符串只有 2 个字符(如 re),它也应该返回 maruti 和 ferrari 作为输出。仅当用户将完整字符串键入为“red”而不是“re”时,您的答案才会返回值。你能修改你的答案吗..
    • 谢谢,一切正常。但还有一个问题。我可以使这个动态( carList.filter(({colors}) => )我希望我可以从外部传递变量而不是硬编码的颜色,例如用户单击的 fieldName。如果用户单击颜色输入字段过滤器数组如果用户单击汽车输入字段,则应按颜色过滤过滤器数组应使用汽车对象。这可能吗,还是我必须为每个字段编写单独的代码?
    • 非常感谢,这完全可以正常工作。我也对你的答案投了赞成票。谢谢。
    【解决方案4】:

    var carList = [
        {
            car: "maruti",
            colors: ["red", "redish","yellow"]
        },
        {
            car: "ferrari",
            colors: ["purple", "red"]
        },
        {
            car: "Merc",
            colors: ["pink", "green"]
        }
    ];
    var m = carList.filter((eachCar) => { 
        var colors = eachCar.colors;
        return colors.filter((eachColor) => {
               return eachColor.indexOf('in') !== -1
        }).length > 0;
    });
                                
    console.log(m);

    【讨论】:

      【解决方案5】:

      我认为这是一个迟到的答案。但你可以关注我的regex 解决方案。

      这里我使用RegExp.prototype.test() 方法,在Array.prototype.some()Array.prototype.filter() 的帮助下。

      var carList = [{car: "maruti", colors: ["red", "redish","yellow"]}, {car: "ferrari", colors: ["purple", "red"]}, {car: "Merc", colors: ["pink", "green"]}];
      
      
      const searchByColor = (list, keyword) => {
          // If you want the keyword must match from the beginning
          // const regex = new RegExp(`^${keyword}`, 'ig');
      	
          // If you want the keyword matches anywhere of the string
          const regex = new RegExp(keyword, 'ig');
          return list.filter(({colors}) => colors.some(color => regex.test(color)));
      }
      
      
      console.log('For keyword "re":', searchByColor(carList, 're'));
      console.log('For keyword "redish":', searchByColor(carList, 'redish'));
      .as-console-wrapper {min-height: 100%!important; top: 0;}

      注意:注意名为green 的颜色也有re 子字符串。尽可能多地获取相关搜索结果是件好事。

      但是,如果您不想匹配字符串的任何位置,请使用注释的第一个正则表达式方法。那就是使用regex 作为:

      const regex = new RegExp(`^${keyword}`, 'ig');
      

      【讨论】:

      • 感谢 Sajeeb 的回复。我有 1 个问题在你的回答中,这一行中的颜色对象返回 list.filter(({colors}) => colors.some(color => regex.test(color)));是硬编码的。我们能不能写一个像 searchByColor(listToBEFiltered, stringToSearch, ArrayName)); 这样的函数所以它是一个动态函数,而不是一个硬编码的函数。如果你能提供一个小模板,那就太好了。
      • 您的意思不是colors 数组,而是任何其他数组?
      猜你喜欢
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      • 2016-01-19
      • 2012-10-14
      • 1970-01-01
      • 2013-03-06
      • 2013-10-04
      • 2014-10-28
      相关资源
      最近更新 更多