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

JavaScript:根据数组项中的数字对数组重新排序,javascript,arrays,Javascript,Arrays,我试图解读一个数组。数组中有顺序错误的字符串项,附加了一个数字以指定顺序。我想获取数组项中的数字,并重新分配数组项索引以反映该数字。例如,var scrambled=[pizza4、to2、I0、eat3、want1]。我有一个函数,它在数组中搜索附加的数字并返回值。现在我想获取返回的值,并将其转换为新数组中新项的索引,如var unclombled=[]。这就是我到目前为止所做的: function unscramblePhrase() { var scrambled = ["pizz

我试图解读一个数组。数组中有顺序错误的字符串项,附加了一个数字以指定顺序。我想获取数组项中的数字,并重新分配数组项索引以反映该数字。例如,var scrambled=[pizza4、to2、I0、eat3、want1]。我有一个函数,它在数组中搜索附加的数字并返回值。现在我想获取返回的值,并将其转换为新数组中新项的索引,如var unclombled=[]。这就是我到目前为止所做的:

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]。

这不是对数组排序的最佳方法,但您的问题是使用array.prototype.push,当您应该只将值分配给未解读的索引时

但真正做到这一点的方法是 注意:此方法对数组进行排序。这可能是好的,也可能不是好的,这取决于您的需求

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

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

这不是对数组进行排序的最佳方法,但您的问题是,您需要使用array.prototype.push,而此时您只需将值分配给unscrambled中的索引

但真正做到这一点的方法是 注意:此方法对数组进行排序。这可能是好的,也可能不是好的,这取决于您的需求

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

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

尝试此方法,如果有效,则不提供任何线索:

功能解读{ var-scrambled=[pizza4,to2,I0,eat3,want1]; 解读的var=[]; 对于var计数器=0;计数器<扰码长度;计数器++{ numPosition=加扰的[counter]。搜索“[0-9]”; arrayIndex=加扰的[计数器]。子字符串组合; console.logarrayIndex; 解译的[arrayIndex]=加扰的[counter]; } console.logunscrambled
}

尝试此方法,如果有效,则不提供任何线索:

功能解读{ var-scrambled=[pizza4,to2,I0,eat3,want1]; 解读的var=[]; 对于var计数器=0;计数器<扰码长度;计数器++{ numPosition=加扰的[counter]。搜索“[0-9]”; arrayIndex=加扰的[计数器]。子字符串组合; console.logarrayIndex; 解译的[arrayIndex]=加扰的[counter]; } console.logunscrambled
}

您可以使用RegEx将数组拆分为值和索引,对它们进行排序,然后使用secondary.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.mapi=> [i.replace/\d/g,,+i.replace/\d/g,] .sorta,b=>a[1]-b[1] .map i=>i[0];
console.logunscrambled 您可以使用RegEx将数组拆分为值和索引,对它们进行排序,然后使用secondary.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.mapi=> [i.replace/\d/g,,+i.replace/\d/g,] .sorta,b=>a[1]-b[1] .map i=>i[0];
console.logunscrambled 您可以使用单个循环,获取字符串和索引的部分,将值分配给索引并返回数组

var-scrambled=[pizza4,to2,I0,eat3,want1], 结果=加扰。减速机,字符串=>{ var[s,i]=string.match/\D+\D+/g; r[i]=s; 返回r; }, [];
console.logresult 您可以使用单个循环,获取字符串和索引的部分,将值分配给索引并返回数组

var-scrambled=[pizza4,to2,I0,eat3,want1], 结果=加扰。减速机,字符串=>{ var[s,i]=string.match/\D+\D+/g; r[i]=s; 返回r; }, [];
console.logresult 您可以尝试使用Array.sort,如下所示

var扰码=[pizza4、to2、I0、eat3、want1] 让getNumberIndex=d=>[…d]。FindIndex=>Number.isInteger+v 让getNumber=d=>d.SliceGetNumberIndex 让unscrambled=scrambled.slice0.sorta,b=>getNumbera-getNumberb
console.logunscrambled您可以尝试使用Array.sort,如下所示

var扰码=[pizza4、to2、I0、eat3、want1] 让getNumberIndex=d=>[…d]。FindIndex=>Number.isInteger+v 让getNumber=d=>d.SliceGetNumberIndex 让unscrambled=scrambled.slice0.sorta,b=>getNumbera-getNumberb
console.logUnscrambled如果字符串包含多个数字怎么办:abc10def22?如果存在具有相同编号的字符串:[abc12,def12]?如果有一个丢失的号码:[abc0,def3]2丢失了怎么办?@ibrahimmahrir也这么想。显然,这是一个非常特殊的情况。正如OP提到的,他已经有了一个从字符串中提取数字的方法。假设数组具有所有正确的

数字0-4,不重复。您希望输出什么?我希望它读取I0 want1到2 eat3 pizza4。如果字符串包含多个数字:abc10def22怎么办?如果存在具有相同编号的字符串:[abc12,def12]?如果有一个丢失的号码:[abc0,def3]2丢失了怎么办?@ibrahimmahrir也这么想。显然,这是一个非常特殊的情况。正如OP提到的,他已经有了一个从字符串中提取数字的方法。假设数组中有所有正确的数字0-4,并且没有重复的数字。你想输出什么?我想让它读I0 want1到2 eat3 pizza4。为什么要使用数组。从一个数组开始,新的数组,而不是原来的数组?显然是一个很好的答案,但我认为这对OP来说并不好,因为他似乎还在学习JS,这是一个非常奇特的ES6片段。不管怎样,都很好。@SamCreamer谢谢!诚然,它看起来很花哨,但实际上相当简单。我认为展示可能有点吓人的代码是一件好事,因为它教会了你新的技术和模式。为什么要在数组上使用Array.from新的数组,而不是原始的?显然这是一个很好的答案,但我认为这对OP来说并不太好,因为他似乎还在学习JS,这是一个非常奇特的ES6代码片段。不管怎样,都很好。@SamCreamer谢谢!诚然,它看起来很花哨,但实际上相当简单。我认为展示可能有点吓人的代码是一件好事,因为它教会了你新的技术和模式;不,这可能会产生引用问题,因为数组在分配期间必须动态增长,这不是所有浏览器都支持的,而是在分配之前以正确的大小实例化它-hand@NikosM. 哪些浏览器不支持动态增长数组?@dovidweisz,实际上没有浏览器支持通过随机分配到一个索引位置来动态增长数组。所做的是将索引作为动态属性添加到数组对象中,而不是作为数组索引本身。无论如何,最好是恢复整个数组,因为大小是已知的,然后任何索引都确实可以分配,而不是简单地在数组中添加动态属性object@NikosM. 如果您所说的是真的,我们可以通过检查array.length.来验证它。不要忘记先实例化未解析的数组,如uncrambled=new Arrayscrambled.length;不,这可能会产生引用问题,因为数组在分配期间必须动态增长,这不是所有浏览器都支持的,而是在分配之前以正确的大小实例化它-hand@NikosM. 哪些浏览器不支持动态增长数组?@dovidweisz,实际上没有浏览器支持通过随机分配到一个索引位置来动态增长数组。所做的是将索引作为动态属性添加到数组对象中,而不是作为数组索引本身。无论如何,最好是恢复整个数组,因为大小是已知的,然后任何索引都确实可以分配,而不是简单地在数组中添加动态属性object@NikosM. 如果你说的是真的,我们可以通过检查array.length.Nice来验证它!听起来可能很傻,但我完全不知道,在数组形成之前,您可以为数组中的任何索引赋值!回答得好!听起来可能很傻,但我完全不知道,在数组形成之前,您可以为数组中的任何索引赋值!
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"]