根据值在另一个字符串数组中的位置对对象数组进行排序
Sort Array of Objects based on position of value in another Array of Strings
我有一个数组:
const CORRECT_ORDER = ['Animal','Plant','Sand','Grass'];
然后我有另一个对象数组:
const UNSORTED = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
我想对 UNSORTED 数组进行排序,使 Animal 类型排在第一位,然后是 Plant,然后是 Sand 和 Grass。
如果 CORRECT_ORDER 数组更改顺序,我应该能够求助于 UNSORTED 数组以匹配新顺序。
可以安全地假设没有类型(草、沙、植物、动物)会重复,并且该类型只会在未排序的数组中出现一次,如果有的话。
我试过类似下面的方法:PSUEDO 代码:
const SORTED = [];
UNSORTED.ForEach(value){
const positionIndex = CORRECT_ORDER.indexOf(value.Type);
if(positionIndex > SORTED.length){
//Push at end
SORTED.push(value);
} else {
//Push at index
SORTED.splice(positionIndex, 0, value);
}
}
return SORTED;
不幸的是,这并不是万无一失的,它经常会错误地排序,尤其是在更大的数据集上。
可以循环correct_order数组,使用js过滤函数过滤未排序的数组。如果过滤器匹配推送到新数组。
const UNSORTED = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
const CORRECT_ORDER = ['Animal','Plant','Sand','Grass'];
let sorted = []
CORRECT_ORDER.forEach(k => {
let n = UNSORTED.filter(obj => {
return obj.Type === k
})
if (n.length > 0) {
sorted.push(n);
}
})
console.log(sorted);
试试这个
function sort() {
const map = {}
CORRECT_ORDER.map((type, i) => (map[type] = i))
const sortedArr = UNSORTED.sort((a, b) => map[a.Type] - map[b.Type])
return sortedArr
}
我做了一个简单的例子,根据 CORRECT_ORDER table:
中的类型索引对对象进行排序
const order = ['Animal','Plant','Sand','Grass'];
const unsorted = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
const sorted = unsorted.sort((a,b) => {
const indexA = order.findIndex(type => a.Type === type);
const indexB = order.findIndex(type => b.Type === type);
return indexA - indexB; // to get positive, 0, negative number for the sort callback.
});
console.log(sorted);
const CORRECT_ORDER = ['Animal','Plant','Sand','Grass'];
const UNSORTED = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
function sort_objects(order, unsortedArray){
let newArray = Array();
for(i = 0; i < order.length; i++){
for(j = 0; j < unsortedArray.length; j++){
if(unsortedArray[j].Type == order[i]){
newArray.push(unsortedArray[j]);
break;
}
}
}
return newArray
}
console.log(sort_objects(CORRECT_ORDER, UNSORTED))
这可能有效,但可以提高效率。
我有一个数组:
const CORRECT_ORDER = ['Animal','Plant','Sand','Grass'];
然后我有另一个对象数组:
const UNSORTED = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
我想对 UNSORTED 数组进行排序,使 Animal 类型排在第一位,然后是 Plant,然后是 Sand 和 Grass。
如果 CORRECT_ORDER 数组更改顺序,我应该能够求助于 UNSORTED 数组以匹配新顺序。
可以安全地假设没有类型(草、沙、植物、动物)会重复,并且该类型只会在未排序的数组中出现一次,如果有的话。
我试过类似下面的方法:PSUEDO 代码:
const SORTED = [];
UNSORTED.ForEach(value){
const positionIndex = CORRECT_ORDER.indexOf(value.Type);
if(positionIndex > SORTED.length){
//Push at end
SORTED.push(value);
} else {
//Push at index
SORTED.splice(positionIndex, 0, value);
}
}
return SORTED;
不幸的是,这并不是万无一失的,它经常会错误地排序,尤其是在更大的数据集上。
可以循环correct_order数组,使用js过滤函数过滤未排序的数组。如果过滤器匹配推送到新数组。
const UNSORTED = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
const CORRECT_ORDER = ['Animal','Plant','Sand','Grass'];
let sorted = []
CORRECT_ORDER.forEach(k => {
let n = UNSORTED.filter(obj => {
return obj.Type === k
})
if (n.length > 0) {
sorted.push(n);
}
})
console.log(sorted);
试试这个
function sort() {
const map = {}
CORRECT_ORDER.map((type, i) => (map[type] = i))
const sortedArr = UNSORTED.sort((a, b) => map[a.Type] - map[b.Type])
return sortedArr
}
我做了一个简单的例子,根据 CORRECT_ORDER table:
中的类型索引对对象进行排序const order = ['Animal','Plant','Sand','Grass'];
const unsorted = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
const sorted = unsorted.sort((a,b) => {
const indexA = order.findIndex(type => a.Type === type);
const indexB = order.findIndex(type => b.Type === type);
return indexA - indexB; // to get positive, 0, negative number for the sort callback.
});
console.log(sorted);
const CORRECT_ORDER = ['Animal','Plant','Sand','Grass'];
const UNSORTED = [{Type: 'Grass', Value: 'Wet'}, {Type: 'Sand', Value: 'Dry'}, {Type: 'Animal', Value: 'Dog'}];
function sort_objects(order, unsortedArray){
let newArray = Array();
for(i = 0; i < order.length; i++){
for(j = 0; j < unsortedArray.length; j++){
if(unsortedArray[j].Type == order[i]){
newArray.push(unsortedArray[j]);
break;
}
}
}
return newArray
}
console.log(sort_objects(CORRECT_ORDER, UNSORTED))
这可能有效,但可以提高效率。