如何在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,我搞错了;)已使用helperclone
更新了代码,并添加了一些注释!我希望这次我是对的。谢谢你纠正我的错误。map不会进行“深度”复制,var temp=source.slice()
会给出相同的结果,而且不太容易键入。@RobG,我弄错了;)已使用helperclone
更新了代码,并添加了一些注释!我希望这次我是对的。谢谢你纠正我。这应该是一个评论,而不是一个答案。嗯,老实说,我认为这是一个有效的替代答案。使用外部库在大多数情况下比自己实现一个新库要好,因为否则问题会被“回答”为使用库的建议,而不是真正的答案。想象一下,问一个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]