【问题标题】:How to rearrange JavaScript array using match?如何使用匹配重新排列 JavaScript 数组?
【发布时间】:2015-11-16 17:08:49
【问题描述】:

假设我们有一个 JavaScript 数组 arr,其中每个 arr[i] 包含一个句子。现在如果我们要搜索包含特定字符串str 的句子,我们可以使用match 来查找这些句子,使用

var newarr = [];                
for(var i = 0; i < arr.length; i++) {
if(arr[i].toLowerCase().match(str.toLowerCase()){       
newarr[newarr.length] = arr[i];             
}
}

新数组newarr 将仅包含包含字符串str 的句子。现在,有没有办法重新排列newarr,使开头包含str的句子排在第一位,然后是中间包含str的句子,最后是包含str的句子?

【问题讨论】:

    标签: javascript jquery arrays string


    【解决方案1】:

    Arrays 上可用的sort 方法可以采用自定义函数来比较元素并根据该函数进行排序。您的自定义排序函数需要接受两个参数,ab,并返回一个数字; ab 是正在比较的数组元素。您的函数返回的数字告诉sort 函数是a 还是b 应该先出现,根据以下规则:

    • 如果返回的数字是&lt;0,那么ab之前
    • 如果返回的数字是&gt;0,那么ba之前
    • 如果返回的数字是0,那么ab 按顺序“相同”

    所以要根据子字符串str 出现的位置对字符串数组进行排序,那么您可以执行以下操作:

    var arr = ['bbbab', 'bbabbb', 'abbb', 'bbbba'];
    
    // Our substring.
    var str = 'a';
    // Make copy of array.
    var newarr = arr.slice()
    // Sort.
    newarr.sort(function (a, b) {
      return a.indexOf(str) - b.indexOf(str);
    });
    console.log(newarr); // => ["abbb", "bbabbb", "bbbab", "bbbba"]
    

    【讨论】:

    • ab 是要比较的数组元素。
    • 有没有办法在排序时使用trim()修剪每个数组元素?
    • abbbabbbbabbbbb等这些应该怎么安排
    • @user3741635,“修剪”是什么意思?如果你愿意,你可以做一些事情newarr = arr.map(function(elt) { return elt.trim(); });
    • 都以a开头,只是长度不同。 indexOf 将全部返回 0。根据我的说法,在对元素进行排序时也应该考虑长度
    【解决方案2】:

    您忘记了 if 条件中的一个括号。

    http://jsfiddle.net/pandeyaditya/LbwgfLvt/

    检查以下代码:

    var arr = ["JS is fun", "JS Rocks", "JS is for techies"];
    var newarr = [];
    var str = "fun";
    for(var i = 0; i < arr.length; i++) {
    if(arr[i].toLowerCase().match(str.toLowerCase())){       
    newarr[newarr.length] = arr[i];             
    }
    }
       alert(newarr);
    

    【讨论】:

    • 以后,你可以只编辑问题来解决这样的小问题。
    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多