如何在javascript中对数组进行排序,但将结果保存在单独的数组中

时间:2016-02-06 03:04:01

标签: javascript

我想基于任何这些对象属性对对象数组进行排序。但我希望原始阵列保持不变。相反,我想在单独的数组中保存索引的排序顺序。

var source = [
  {"a": 2, "b": 8, "c": 9},
  {"a": 4, "b": 3, "c": 7},  
  {"a": 1, "b": 0, "c": 6}
]

var sortedIndexes;

SomeSortOfSortMethod("a", "asc");

// result of sortedIndexes containing indexes to source array:
// [2, 0, 1] 

任何想法如何做到这一点?我不能使用内置的javascript排序方法,因为它改变了源代码。我需要捕获排序的内容并将该顺序保存为源arry的索引。

2 个答案:

答案 0 :(得分:1)

  

使用array.map()clone制作初始数组的深层副本,并在copied数组上应用排序功能。

     

map()方法创建一个新数组,其结果是在此数组中的每个元素上调用提供的函数。

     

sort()方法对数组中的元素进行排序并返回数组。

试试这个:

var source = [{
  "a": 2,
  "b": 8,
  "c": 9
}, {
  "a": 4,
  "b": 3,
  "c": 7
}, {
  "a": 1,
  "b": 0,
  "c": 6
}];

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  var copy = obj.constructor();
  for (var attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}
var temp = source.map(function(arr) {
  return clone(arr); //clone will make deep copy of the object
});
source[0].a = 50; //update the value from source object, it will not update `temp` array 
temp.sort(function(a, b) {
  return a.a - b.a; // `.a` will be the `key` to be sorted
});
snippet.log(JSON.stringify(temp));
snippet.log(JSON.stringify(source));
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 1 :(得分:1)

var source = [
      {"a": 2, "b": 8, "c": 9},
      {"a": 4, "b": 3, "c": 7},  
      {"a": 1, "b": 0, "c": 6}
    ];

var orderedCopyArray = _.sortBy(source, "a");

// Defualt ascending
console.log(JSON.stringify(orderedCopyArray));

// Descending
console.log(JSON.stringify(orderedCopyArray.reverse()));

var indexesArray = [], leng = source.length;

// Descending array ordered
var reverse = orderedCopyArray.reverse();

// Get index
for(var i=0; i < leng; i++){
  var obj1 = reverse[i]; 
  for(var j=0; j < leng; j++){
    var obj2 = source[j];
    if(_.isEqual(obj1, obj2)){
      indexesArray.push(j);
      break;
    }
  }
}

console.log(indexesArray); //[2, 0, 1]