【问题标题】:reorder array without changing index在不更改索引的情况下重新排序数组
【发布时间】:2021-03-09 17:27:04
【问题描述】:

我想在不更改索引值的情况下对数组进行排序。我怎样才能做到这一点?

数组:

let data = [];
data[12] = {"apples":1, "pears":2, "oranges":3};
data[25] = {"apples":3, "pears":3, "oranges":5};
data[18] = {"apples":4, "pears":1, "oranges":6};

我试过了:

function reorder(b, a) {
  return a - b;
}

但是reorder函数的输出是

data[0] = {"apples":3, "pears":3, "oranges":5};
data[1] = {"apples":4, "pears":1, "oranges":6};
data[2] = {"apples":1, "pears":2, "oranges":3};

我想实现这样的目标

data[25] = {"apples":3, "pears":3, "oranges":5};
data[18] = {"apples":4, "pears":1, "oranges":6};
data[12] = {"apples":1, "pears":2, "oranges":3};

【问题讨论】:

  • 该函数正在执行预期的操作...您所期望的不是“我认为”的排序 :) 您只是在“视觉上”对数组进行排序。我仍然很想了解真正的预期结果。如果它们的新“预期”顺序很重要,为什么不使用这些旧索引作为键?
  • 这似乎是XY problem。请更详细地解释您的用例以及您实际需要解决的更高级别的问题

标签: javascript jquery arrays sorting


【解决方案1】:

这会解决你的问题,但请写下我刚刚解决了什么任务。

let data = [];
data[12] = {"apples":1, "pears":2, "oranges":3};
data[25] = {"apples":3, "pears":3, "oranges":5};
data[18] = {"apples":4, "pears":1, "oranges":6};

let sorted = data
  .map((item, n)=>({ n, item, val: item.apples + item.pears + item.oranges }))
  .sort((a,b)=> a.val - b.val), i = 0;

data.forEach((item, n)=> data[n] = sorted[i++].item);

【讨论】:

    【解决方案2】:

    您似乎打算对索引进行排序。你可以这样做:

    let data = [];
    data[12] = {"apples":1, "pears":2, "oranges":3};
    data[25] = {"apples":3, "pears":3, "oranges":5};
    data[18] = {"apples":4, "pears":1, "oranges":6};
    
    let keys = [];
    
    for (key in data) keys.push(key);
    
    for (var i = 0; i < keys.length; i++) {
        for (var j = i + 1; j < keys.length; j++) {
            if (keys[i] > keys[j]) {
                var aux = keys[i];
                keys[i] = keys[j];
                keys[j] = aux;
            }
        }
    }
    

    问题是

    var newObject = {};
    for (let key of keys) newObject[key] = data[key];
    data = newObject;
    

    不一定会改变键的顺序:

    这意味着如果您打算始终以降序进行迭代,那么您将需要按照您喜欢的顺序迭代keys,并使用它来识别当前项目。

    【讨论】: