在不更改索引的情况下重新排序数组
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 架构中指定的分析器?