根据值在另一个字符串数组中的位置对对象数组进行排序

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);

您可以查看其implementation in JSFiddle

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

这可能有效,但可以提高效率。