繁体   English   中英

JavaScript:根据数组项中的数字对数组重新排序

JavaScript: reorder array based on numbers within array items

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试解读一个数组。 数组中的字符串项目乱序,并附带一个数字,以指定顺序。 我想在数组项中获取数字并重新分配数组项索引以反映该数字。 例如var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"] 我有一个函数,在数组中搜索附加的数字并返回值。 现在,我想将返回的值转换为新数组中新项目的索引,例如var unscrambled = [] 这是我到目前为止的内容:

function unscramblePhrase() {
    var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"];   
    var unscrambled = [];
    for (var counter = 0; counter < scrambled.length; counter++) {
        numPosition = scrambled[counter].search('[0-9]');
        arrayIndex = scrambled[counter].substring(numPosition);
        console.log(arrayIndex);
        unscrambled.push(scrambled[arrayIndex]);
    }
 console.log(unscrambled)
}

我看到我的arrayIndex正在从加扰的数组项的末尾提取数字,但是我尝试根据此变量分配索引位置的结果是产生了一个新的加扰的数组: ["want1", "I0", "pizza4", "eat3", "to2"]

6 个回复

这不是对数组进行排序的最佳方法,但是您的问题是,使用Array.prototype.push时,应该只将值分配给unscrambled的索引。

unscrambled[arrayIndex] = scrambled[counter];

但是真正做到这一点的方法是使用Array.prototype.sort

function getNum(str){
    return Number(str.substring(str.length -1));
}


unscrambled.sort((a, b) => getNum(a) - getNum(b));

注意:此方法对数组进行原位排序。 根据您的要求,这可能不错,也可能不好

但是您始终可以在克隆上使用它:

 [...unscrambled].sort((a, b) => getNum(a) - getNum(b)); 

您可以使用RegEx将数组拆分为值和索引,对其进行排序,然后使用辅助.map删除附加信息以返回字符串数组,从而简化此过程。

scrambled.map(i => 
[i.replace(/\d/g,""), +i.replace(/\D/g,"")])
.sort((a, b) => a[1] - b[1])).map(i => i[0]);

 var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"]; var unscrambled = scrambled.map(i => [i.replace(/\\d/g,""), +i.replace(/\\D/g,"")]) .sort((a, b) => a[1] - b[1]) .map( i => i[0]); console.log(unscrambled); 

试试这个(如果可行,不知道):

function unscramblePhrase() { var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"];
var unscrambled = []; for (var counter = 0; counter < scrambled.length; counter++) { numPosition = scrambled[counter].search('[0-9]'); arrayIndex = scrambled[counter].substring(numPosition); console.log(arrayIndex); unscrambled[arrayIndex] = scrambled[counter]; } console.log(unscrambled) }

您可以执行一个循环并获取字符串和索引的各个部分,将值分配给索引并返回数组。

 var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"], result = scrambled.reduce((r, string) => { var [s, i] = string.match(/\\D+|\\d+/g); r[i] = s; return r; }, []); console.log(result); 

对象带来更多乐趣。

 var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"], result = Object.assign( [], ...scrambled.map(s => (([v, k]) => ({ [k]: v }))(s.match(/\\D+|\\d+/g))) ); console.log(result); 

您可以尝试使用“ Array.sort”,如下所示

 var scrambled = ["pizza4", "to2", "I0", "eat3", "want1"] let getNumberIndex = (d) => [...d].findIndex(v => Number.isInteger(+v)) let getNumber = (d) => d.slice(getNumberIndex(d)) let unscrambled = scrambled.slice(0).sort((a,b) => getNumber(a) - getNumber(b)) console.log(unscrambled) 

const words = ["I0", "want1", "to2", "eat3", "pizza4"]

words
    .map (w => parseInt (w [--w.length]))
    .sort ()
    .map (i => words.filter (w => w [--w.length] == i) [0].replace (i, ''))

// ["I", "want", "to", "eat", "pizza"]
1 如何在MongoDB中自动对数组项进行重新排序?

我有一个playlists集合。 集合中的每个文档都包含一个entries字段,即一个数组。 如何自动更改播放列表中entries的顺序? (例如,如果另一个用户试图在同一时间 ,以$push新的项目,我想,以确保新的条目为$push重新排序发生后才版) 如果我执行find() ...

2 JavaScript:对数组重新排序

我在SO上阅读了一些有关处理拼接时的问题的答案(包括将数组元素从一个数组位置移动到另一个数组位置 ),但我无法解决问题。 我正在尝试以特定模式重新排列数组。 让我们假设模式是所有的负数应到阵列的左侧 ,所有的阳性数字应该是阵列的权利 。 负数和正数之间应用零分隔(如果有)。 保持订单 ...

3 在JavaScript中对数字数组和对象数组进行排序

假设我生成两个数组,其中一个包含数字数组: 还有另一个数组,其中保存有一些信息的对象 第二数组中的对象与第一数组中的数字有关。 因此,object1与5.65相关,object2与3.25相关,依此类推。 所以我想按升序对数组1进行排序,同时还要对数组2进行排序。 ...

4 Javascript数组项到数字

我制作了一个程序,对用户输入的数字进行排序。 问题是,当我插入一个空白空间时,它以数字0的形式存储在数组中。我试图设置一些条件来防止这种情况,但似乎没有任何效果。 有什么办法吗? 这是我的代码的一小段,我认为该错误会发生,并且应该设置某种条件: stringArray = userInpu ...

5 按子数组项中的值对数组排序

我试图按“名称”项对对象/数组中的项进行排序, 我使用此页面作为参考,对对象数组进行排序并构建以下代码: 不幸的是,没有错误返回,console.log也没有返回任何东西。 任何帮助是极大的赞赏! 编辑:给出答案后,似乎需要将变量“ test”作为一个数组,但是,该变量是在 ...

暂无
暂无

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

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