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

时间:2014-09-28 20:36:02

标签: javascript jquery

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

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]

任何帮助都将不胜感激。

6 个答案:

答案 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)

&#13;
&#13;
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;
&#13;
&#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));

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

答案 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]; });