[英]How to transform and reorder array in JavaScript?
有没有一种优雅的方式来重新排序 JavaScript 数组? 例如,说我有一个这样的数组:
let array = ['a', 'b', 'c']
现在我想将其重新排列为
['b', 'a', 'a', 'c', 'a']
在 JavaScript 中是否有内置的高阶函数可以做到这一点? 就像是
let reordered = array.reorderMagic([1, 0, 0, 2, 0])
我可以在哪里指定一个索引数组? 如果没有,您能否建议一个可以帮助我进行此类矩阵式操作的库?
你可以在Array.prototype
上创建一个方法虽然不推荐
if (!('reorderMagic' in Array.prototype)) { Array.prototype.reorderMagic = function(ref) { const arr = this; return ref.map((n) => arr[n]); }; } let array = ["a", "b", "c"]; let reordered = array.reorderMagic([1, 0, 0, 2, 0]); console.log(reordered);
But I won't recommend that because there might be a scenario where someone or any library might override your method(This is just one scenario)
因此,您可以创建一个实用程序函数并获得所需的结果:
function reorderMagic(arr, ref) { return ref.map((n) => arr[n]); } let array = ["a", "b", "c"]; let reordered = reorderMagic(array, [1, 0, 0, 2, 0]); console.log(reordered);
您可以在 Array.prototype 上创建一个方法
扩展Array.prototype
被认为是不好的做法,但解决方案的其余部分效果很好。
我会推荐这样的 API:
function chooseIndices(arr, indexes) {
return indexes.map(i => arr[i]);
}
然后这样使用它:
let array = ["a", "b", "c"];
let reordered = chooseIndices(array, [1, 0, 0, 2, 0]);
// reordered === ['b', 'a', 'a', 'c', 'a']
上面的函数不考虑无效索引。 例如,如果你在上面的例子中使用索引5
,你只会得到一个undefined
。
您可以决定如何处理无效索引。 但一种选择是在使用索引数组之前简单地filter
它们。
const arr = ['a','b','c']; const order = [1, 0, 0, 2, 0]; const reorderMagic = (arr, indexes) => indexes.map((i) => arr[i]); console.log(reorderMagic(arr, order)); // [ "b","a","a","c","a"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.