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

如何在javascript中对数组进行排序,但将结果保存在单独的数组中,javascript,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 contain

我想根据这些对象属性对对象数组进行排序。但我希望原始数组保持不变。相反,我想将索引的排序顺序保存在一个单独的数组中

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的索引

使用
array.map()
对初始数组进行深度复制,并对复制的
数组应用排序功能

该方法创建一个新数组,其结果是对该数组中的每个元素调用提供的函数

该方法对数组中的元素进行适当排序并返回数组

试试这个:

var源=[{
“a”:2,
“b”:8,
“c”:9
}, {
“a”:4,
“b”:3,
“c”:7
}, {
“a”:1,
“b”:0,
“c”:6
}];
功能克隆(obj){
如果(null==obj | |“object”!=typeof obj)返回obj;
var copy=obj.constructor();
for(obj中的var attr){
如果(obj.hasOwnProperty(attr))copy[attr]=obj[attr];
}
返回副本;
}
var temp=源映射(函数(arr){
返回克隆(arr);//克隆将对对象进行深度复制
});
来源[0]。a=50//从源对象更新值,它不会更新'temp'数组
温度排序(功能(a、b){
返回a.a-b.a;/`。a`将是要排序的'key'
});
log(JSON.stringify(temp));
log(JSON.stringify(source))
使用
array.map()
对初始数组进行深度复制,并对复制的
数组应用排序功能

该方法创建一个新数组,其结果是对该数组中的每个元素调用提供的函数

该方法对数组中的元素进行适当排序并返回数组

试试这个:

var源=[{
“a”:2,
“b”:8,
“c”:9
}, {
“a”:4,
“b”:3,
“c”:7
}, {
“a”:1,
“b”:0,
“c”:6
}];
功能克隆(obj){
如果(null==obj | |“object”!=typeof obj)返回obj;
var copy=obj.constructor();
for(obj中的var attr){
如果(obj.hasOwnProperty(attr))copy[attr]=obj[attr];
}
返回副本;
}
var temp=源映射(函数(arr){
返回克隆(arr);//克隆将对对象进行深度复制
});
来源[0]。a=50//从源对象更新值,它不会更新'temp'数组
温度排序(功能(a、b){
返回a.a-b.a;/`。a`将是要排序的'key'
});
log(JSON.stringify(temp));
log(JSON.stringify(source))
var源=[
{“a”:2,“b”:8,“c”:9},
{“a”:4,“b”:3,“c”:7},
{a:1,b:0,c:6}
];
var orderedCopyArray=u.sortBy(源,“a”);
//解除升空
log(JSON.stringify(orderedCopyArray));
//下降的
log(JSON.stringify(orderedCopyArray.reverse());
var indexesArray=[],leng=source.length;
//降序数组
var reverse=orderedCopyArray.reverse();
//获取索引
对于(变量i=0;i
var源=[
{“a”:2,“b”:8,“c”:9},
{“a”:4,“b”:3,“c”:7},
{a:1,b:0,c:6}
];
var orderedCopyArray=u.sortBy(源,“a”);
//解除升空
log(JSON.stringify(orderedCopyArray));
//下降的
log(JSON.stringify(orderedCopyArray.reverse());
var indexesArray=[],leng=source.length;
//降序数组
var reverse=orderedCopyArray.reverse();
//获取索引
对于(变量i=0;i
复制初始数组并操作复制的数组;)复制初始数组并操作复制的数组;)map不会进行“深度”复制,
var temp=source.slice()
会给出相同的结果,而且类型较少。@RobG,我搞错了;)已使用helper
clone
更新了代码,并添加了一些注释!我希望这次我是对的。谢谢你纠正我的错误。map不会进行“深度”复制,
var temp=source.slice()
会给出相同的结果,而且不太容易键入。@RobG,我弄错了;)已使用helper
clone
更新了代码,并添加了一些注释!我希望这次我是对的。谢谢你纠正我。这应该是一个评论,而不是一个答案。嗯,老实说,我认为这是一个有效的替代答案。使用外部库在大多数情况下比自己实现一个新库要好,因为否则问题会被“回答”为使用库的建议,而不是真正的答案。想象一下,问一个DOM问题,得到的答案是“UsejQuery”、“UseDojo”、“UsePrototype.js”……好的,我添加了一个例子,我同意RobG的说法,问题不能通过简单地说使用某个库来回答。但我非常感谢ronIDX花时间解释整个过程。这应该是一个评论,而不是一个答案。嗯,老实说,我认为这是一个有效的替代答案。使用外部库在大多数情况下比自己实现一个新库要好,因为否则问题会被“回答”为使用库的建议,而不是真正的答案。想象一下,问一个DOM问题,得到的答案是“UsejQuery”、“UseDojo”、“UsePrototype.js”……好的,我添加了一个例子,我同意RobG的说法,问题不能通过简单地说使用某个库来回答。但我非常感谢ronIDX花时间解释整个过程。
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]