将数组转换为保存原始索引字段的对象

Convert array to object with saving original index field

本文关键字:索引 字段 对象 原始 保存 数组 转换      更新时间:2023-09-26

我有一个数组,按以下方式排序

var items = [2.99, 5.99, 23.99, 1.99];
items.sort(function(a,b) { return a - b;});

这会输出以下内容:

[1.99, 2.99, 5.99, 23.99]

但我需要一种方法来排序,但要保留原始索引的索引,例如

[3: 1.99, 0: 2.99, 1: 5.99, 2:23.99]

如有任何帮助,我们将不胜感激。

将其映射到一个对象数组。

因此,在生成的数组中,每个成员都是一个对象,其n属性用于保存数字,i属性用于保存原始索引。

然后,您可以迭代该数组,并像正常情况一样获得数据。

var items = [2.99, 5.99, 23.99, 1.99];
var arr_of_objs = items.map(function(n, i) {
    return { n:n, i:i };
}).sort(function(a, b) {
    return a.n - b.n;
});
arr_of_objs.forEach(function(obj, i) {
    this.textContent += "number: " + obj.n + ", orig idx: " + obj.i + ", new idx: " + i + "'n";
}, document.querySelector("pre"));
<pre></pre>

var items = [2.99, 5.99, 23.99, 1.99];
var sortable = [];
for (var i = 0; i < items.length; i++) {
  sortable.push([i, items[i]]);
}
sortable.sort(function(a, b) {
  return a[1] - b[1]
});
console.log(sortable);

不幸的是,在这种情况下,JS中无法进行get排序。JS只将数组理解为[0:1.99,1:2.99,3:23.99]——您不能更改索引的顺序。但您可以使用数组或对象数组来解决问题。

var items = [2.99, 5.99, 23.99, 1.99];

function PreserveKeysSorting(arr) {
    var arr = arr
        obj = [];
    for(i in arr) {
        obj.push({index: i, value: arr[i]});
    }
    obj.sort(function(a,b) { return a.value - b.value;});
    return obj;
}
console.log(items);
console.log(PreserveKeysSorting(items));

现场演示--http://jsfiddle.net/u1g0xsap/1/

您想要的数组无效,但您可以执行以下操作:

首先制作一个数组,其中包含持久化索引的对象:

var itemsObj = []; 
items.forEach(function(value, index) { 
    itemsObj.push({
        value: value, 
        index: index 
    });
});

然后你可以这样排序:

items.sort(function(a,b) { return a.value - b.value;});

你会得到一系列像这样的物体

 [{index:3, value: 1.99}, {index: 0, value: 2.99}, {index: 1, value: 5.99}, {index:2, value:23.99}]

将索引硬编码到数组中:

var items = [2.99, 5.99, 23.99, 1.99]
var itemsWithIndex = [];
for (i=0; i<items.length; i++) { itemsWithIndex[i] = [i+1, items[i]]; }
itemsWithIndex.sort(function(a,b) { return a[1]-b[1]; });

请注意,为了清晰起见,添加了一个辅助变量(itemsWithIndex),但您也可以只更新原始数组:

var items = [2.99, 5.99, 23.99, 1.99]
for (i=0; i<items.length; i++) { items[i] = [i+1, items[i]]; }
items.sort(function(a,b) { return a[1]-b[1]; });

您可以使用两个数组和indexOf()方法:

// Variables
var items = items_sort = [2.99, 5.99, 23.99, 1.99];
var order = new Array();
// Sort array
items_sort.sort(function(a,b) { return a - b;});
// Get order
for (i = 0; i < items.length; i++) {
    order[i] = items.indexOf(items_sort[i]);
}