【问题标题】:How to transform and reorder array in JavaScript?如何在 JavaScript 中转换和重新排序数组?
【发布时间】:2021-11-09 05:34:31
【问题描述】:

有没有一种优雅的方式来重新排序 JavaScript 数组?例如,说我有一个这样的数组:

let array = ['a', 'b', 'c']

现在我想把它重新排列成

['b', 'a', 'a', 'c', 'a']

在 JavaScript 中是否有内置的高阶函数可以做到这一点?类似的东西

let reordered = array.reorderMagic([1, 0, 0, 2, 0])

我可以在哪里指定一个索引数组?如果没有,你能推荐一个库来帮助我做这些类似矩阵的操作吗?

【问题讨论】:

    标签: javascript arrays higher-order-functions


    【解决方案1】:

    你可以在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);

    【讨论】:

    • 如果您要向原型添加新方法,最好检查一下它是否不存在(即使方法的名称不明确)。 if (!('reorderMagic' in Array.prototype)) {...}.
    【解决方案2】:

    你可以在 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 那些。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多