在不更改索引的情况下重新排序数组

Posted

技术标签:

【中文标题】在不更改索引的情况下重新排序数组【英文标题】: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。请更详细地解释您的用例以及您实际需要解决的更高级别的问题 【参考方案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,并使用它来识别当前项目。

【讨论】:

以上是关于在不更改索引的情况下重新排序数组的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不从原始源重新索引的情况下更改 Solr 架构中指定的分析器?

更改特定索引而不在 Vuejs 中重新渲染整个数组

如何在不重新加载页面的情况下更改页面 url

在不重新加载 web 视图的情况下更改 html 文本颜色

如何在不重新索引的情况下将项目添加到 laravel 列表集合中?

如何在不重新加载页面的情况下更改 URL?