我有一个按以下方式排序的数组
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]
任何帮助都将不胜感激。
答案 0 :(得分:3)
将其映射到对象数组。
因此,在结果数组中,每个成员都是一个具有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>
答案 1 :(得分:1)
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);
&#13;
答案 2 :(得分:1)
不幸的是,在这种情况下,JS无法进行排序。 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));
答案 3 :(得分: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}]
答案 4 :(得分: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]);
}
答案 5 :(得分:1)
将索引硬编码到数组中:
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]; });