【问题标题】:How to sort one array based on how another gets sorted? (Javascript)如何根据另一个数组的排序方式对一个数组进行排序? (Javascript)
【发布时间】:2015-12-21 21:26:08
【问题描述】:

我必须创建一个函数来根据每个数字的“权重”对一串数字进行排序——“权重”是数字加在一起的数字(99 的权重为 18,权重为100 将是 1,依此类推)。这意味着字符串"100 54 32 62" 将返回"100 32 62 54"

我可以使用以下方法获得这些数字的权重数组:

function orderWeight(str) {
    var arr = str.split(" ");
    var sortArr = [];
    arr.forEach(t => sortArr.push(t.split("").map(s => parseInt(s, 10)).reduce(add, 0)));
}

其中add 只是一个通用的加法函数。对于上面的示例,sortArr 将是 [1, 9, 5, 8]

根据新的数字权重数组sortArr 的排序方式,对字符串arr 中的原始数字数组进行排序的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: javascript arrays algorithm sorting


    【解决方案1】:

    这应该可以解决问题:

    var x = '100 54 32 62';
    
    function orderWeight(str) {
      return str.split(' ').sort(function(a, b) {
        return (a.split('').reduce(function(p, c) { return +p + +c; })) > (b.split('').reduce(function(p, c) { return +p + +c; }));
      }).join(' ');
    }
    
    var result = orderWeight(x);
    

    输出:

    100 32 62 54
    

    更新:

    根据 Sterling 的建议,这里是用 lambda 格式编写的相同函数。

    var x = '100 54 32 62';
    
    function orderWeight(str) {
      return str.split(' ').sort((a, b) => a.split('').reduce((p, c) => +p + +c) > b.split('').reduce((p, c) => +p + +c)).join(' ');
    }
    
    var result = orderWeight(x);
    

    注意:这是我第一次使用 lambda 语法编写 Javascript。感谢斯特林的建议。

    【讨论】:

    • 工作就像一个魅力!谢谢你。我需要更多的递归练习。
    • 您应该编辑它以显示 ES6 语法,就像 OP 正在使用的那样
    • @Sterling - 我不确定你的意思,请详细说明,以便我更新答案...谢谢
    • OP 在匿名函数上使用胖箭头函数 (lambdas)。
    • 干得好。为什么你使用 +p 和 +c 而不是普通的 p 和 c ??
    【解决方案2】:

    sorting with map 的解决方案。

    function sort(string) {
        var array = string.split(' '),
            mapped = array.map(function (a, i) {
                return { index: i, value: +a.split('').reduce(function (a, b) { return +a + +b; }) };
            });
        return mapped.sort(function (a, b) {
            return a.value - b.value;
        }).map(function (a) {
            return array[a.index];
        }).join(' ');
    }
    
    document.write('<pre>' + JSON.stringify(sort('100 54 32 62'), 0, 4) + '</pre>');

    【讨论】:

      【解决方案3】:

      我将有一个索引数组 (0..n-1) 并根据权重数组对其进行排序(通过传递一个比较给定索引值的权重的比较函数)。 然后你将有一个索引数组,它显示每个项目应该在哪里(在你的例子中,索引数组将是 [0, 2, 3, 1] 这意味着 arr[0] 应该是第一个,然后是 arr[2]等。所以现在您可以使用索引数组构建排序数组,例如 [arr[0]、arr[2]、arr[3]、arr[1]]。 总结一下:获取输入数组,计算权重数组,创建索引数组0..n-1,根据权重数组排序,最后根据排序后的索引数组构造输出数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-20
        • 2013-11-10
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2018-07-13
        相关资源
        最近更新 更多