如何使用匹配重新排列 JavaScript 数组?

Posted

技术标签:

【中文标题】如何使用匹配重新排列 JavaScript 数组?【英文标题】:How to rearrange JavaScript array using match? 【发布时间】: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的句子?

【问题讨论】:

【参考方案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);

【讨论】:

以后,你可以只编辑问题来解决这样的小问题。

以上是关于如何使用匹配重新排列 JavaScript 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何重新排列javascript循环中的数字?

如何在numpy中优雅地通过子数组重新排列数组?

如何重新排列数组中的数据,使两个相似的项目不相邻?

如何将向量重新排列为列而不是行?

如何使用 Node.js/JavaScript 合并两个按键值匹配的数组值

如何重新排列我的数组值以保持与列的关系?