如何在 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 那些。