如何在 JavaScript 中转换和重新排序数组?
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
上创建方法,但不推荐
Read: JavaScript: What dangers are in extending 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);
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"]
You can create a method on 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
那些。
是否有一种优雅的方法来重新排序 JavaScript 数组?例如,假设我有一个这样的数组:
let array = ['a', 'b', 'c']
现在我想将其重新排列为
['b', 'a', 'a', 'c', 'a']
在 JavaScript 中是否有内置的高阶函数可以做到这一点?像
let reordered = array.reorderMagic([1, 0, 0, 2, 0])
我在哪里可以指定一个索引数组?如果没有,你能推荐一个库来帮助我进行这些类似矩阵的操作吗?
您可以在 Array.prototype
上创建方法,但不推荐
Read: JavaScript: What dangers are in extending 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);
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"]
You can create a method on 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
那些。