按特定顺序对JS对象重新排序

时间:2020-07-16 21:51:32

标签: javascript json

我有一个JSON对象(数组数组),我需要按照特定的顺序进行过滤:

order: ['Hors','TTC','Total général', 'verger', ' Tra']

data = [[" Tra", "100 - 149 ch", "Total"]
[" Tra", "150 - 199 ch", "150 - 159 ch"]
[" Tra", "150 - 199 ch", "160 - 169 ch"]
[" Tra", "500 - 999 ch", "Total"]
[" Tra", "Total", ""]
["Comparable", "", ""]
["Hors", "", ""]
["TTC", "", ""]
["Total général", "", ""]
["vergers", "  1 - 49 ch", "20 - 29 ch"]
["vergers", "  1 - 49 ch", "30 - 39 ch"]
["vergers", "  1 - 49 ch", "40 - 49 ch"]
["vergers", " 50 - 99 ch", "70 - 79 ch"]]

我尝试使用sort(),但我不符合我的需要,并且某些字符串包含空格:

data.sort(function (a, b) {
    return data.sort((a,b) => order.indexOf(a) - order.indexOf(b)) ;

});

此解决方案无法满足我的需求,但可以使同一对象静止

4 个答案:

答案 0 :(得分:1)

如果您希望返回的所有数据均按顺序数组排序,则可以使用此类过滤器

order= ['Hors','TTC','Total général', 'vergers', ' Tra']
const data = [ [" Tra", "100 - 149 ch", "Total"], [" Tra", "150 - 199 ch", "150 - 159 ch"], [" Tra", "150 - 199 ch", "160 - 169 ch"], [" Tra", "500 - 999 ch", "Total"], [" Tra", "Total", ""], ["Comparable", "", ""], ["Hors", "", ""], ["TTC", "", ""], ["Total général", "", ""], ["vergers", "  1 - 49 ch", "20 - 29 ch"], ["vergers", "  1 - 49 ch", "30 - 39 ch"], ["vergers", "  1 - 49 ch", "40 - 49 ch"], ["vergers", " 50 - 99 ch", "70 - 79 ch"] ]

function sort(order){
   result=[]
   order.forEach(el =>result.push(data.filter(o=>el==o[0])));
   result.unshift(data.filter(o=>!order.some(y=>y==o[0])))
  return result.flat()
}
console.log(sort(order))

如果您只想对订单数组中的元素进行过滤和排序,可以尝试

order= ['Hors','TTC','Total général', 'vergers', ' Tra']
const data = [ [" Tra", "100 - 149 ch", "Total"], [" Tra", "150 - 199 ch", "150 - 159 ch"], [" Tra", "150 - 199 ch", "160 - 169 ch"], [" Tra", "500 - 999 ch", "Total"], [" Tra", "Total", ""], ["Comparable", "", ""], ["Hors", "", ""], ["TTC", "", ""], ["Total général", "", ""], ["vergers", "  1 - 49 ch", "20 - 29 ch"], ["vergers", "  1 - 49 ch", "30 - 39 ch"], ["vergers", "  1 - 49 ch", "40 - 49 ch"], ["vergers", " 50 - 99 ch", "70 - 79 ch"] ]

function sort(order){
   result=[]
   order.forEach(el =>result.push(data.filter(o=>el==o[0])));
  return result.flat()
}
console.log(sort(order))

答案 1 :(得分:0)

如果要按每个数组的第一个元素排序,则应该可以:

(我将“ verger”更改为“ vergers”。我想那是一个错字)

var order = ['Hors','TTC','Total général', 'vergers', ' Tra']

var data = [
  [" Tra", "100 - 149 ch", "Total"],
  [" Tra", "150 - 199 ch", "150 - 159 ch"],
  [" Tra", "150 - 199 ch", "160 - 169 ch"],
  [" Tra", "500 - 999 ch", "Total"],
  [" Tra", "Total", ""],
  ["Comparable", "", ""],
  ["Hors", "", ""],
  ["TTC", "", ""],
  ["Total général", "", ""],
  ["vergers", "  1 - 49 ch", "20 - 29 ch"],
  ["vergers", "  1 - 49 ch", "30 - 39 ch"],
  ["vergers", "  1 - 49 ch", "40 - 49 ch"],
  ["vergers", " 50 - 99 ch", "70 - 79 ch"]
];

data.sort((a,b) => order.indexOf(a[0]) - order.indexOf(b[0])) ;

console.log(data)

如果您还想过滤掉不匹配的元素:

var order = ['Hors','TTC','Total général', 'vergers', ' Tra']

var data = [
  [" Tra", "100 - 149 ch", "Total"],
  [" Tra", "150 - 199 ch", "150 - 159 ch"],
  [" Tra", "150 - 199 ch", "160 - 169 ch"],
  [" Tra", "500 - 999 ch", "Total"],
  [" Tra", "Total", ""],
  ["Comparable", "", ""],
  ["Hors", "", ""],
  ["TTC", "", ""],
  ["Total général", "", ""],
  ["vergers", "  1 - 49 ch", "20 - 29 ch"],
  ["vergers", "  1 - 49 ch", "30 - 39 ch"],
  ["vergers", "  1 - 49 ch", "40 - 49 ch"],
  ["vergers", " 50 - 99 ch", "70 - 79 ch"]
];

data = data
  .filter(x => order.indexOf(x[0]) > -1)
  .sort((a,b) => order.indexOf(a[0]) - order.indexOf(b[0]));

console.log(data)

答案 2 :(得分:0)

const data = [
    [" Tra", "100 - 149 ch", "Total"],
    [" Tra", "150 - 199 ch", "150 - 159 ch"],
    [" Tra", "150 - 199 ch", "160 - 169 ch"],
    [" Tra", "500 - 999 ch", "Total"],
    [" Tra", "Total", ""],
    ["Comparable", "", ""],
    ["Hors", "", ""],
    ["TTC", "", ""],
    ["Total général", "", ""],
    ["vergers", "  1 - 49 ch", "20 - 29 ch"],
    ["vergers", "  1 - 49 ch", "30 - 39 ch"],
    ["vergers", "  1 - 49 ch", "40 - 49 ch"],
    ["vergers", " 50 - 99 ch", "70 - 79 ch"]
  ]
  
  function sequence(arr) {
    return arr.filter(ele => ["Hors","TTC", "Total général"].some(val => val === ele[0]))
      .concat(arr.filter(ele => ele[0] === "vergers"))
      .concat(arr.filter(ele => ele[0] === " Tra"))
  }
  
  console.log(sequence(data));

答案 3 :(得分:0)

它不是indexOf(a) / indexOf(b),而是indexOf(a[0]) / indexOf(b[0]),因为您想比较每个数组的第一个元素,而不是整个数组。

const order = ['Hors','TTC','Total général', 'vergers', ' Tra'];                
                                                                                
const data = [                                                                  
    [" Tra", "100 - 149 ch", "Total"],                                          
    [" Tra", "150 - 199 ch", "150 - 159 ch"],                                   
    [" Tra", "150 - 199 ch", "160 - 169 ch"],                                   
    [" Tra", "500 - 999 ch", "Total"],                                          
    [" Tra", "Total", ""],                                                      
    ["Comparable", "", ""],                                                     
    ["Hors", "", ""],                                                           
    ["TTC", "", ""],                                                            
    ["Total général", "", ""],                                                  
    ["vergers", "  1 - 49 ch", "20 - 29 ch"],                                   
    ["vergers", "  1 - 49 ch", "30 - 39 ch"],                                   
    ["vergers", "  1 - 49 ch", "40 - 49 ch"],                                   
    ["vergers", " 50 - 99 ch", "70 - 79 ch"],                                   
];                                                                              
                                                                                
    /* const weights = Object.fromEntries( */                                   
    /*     order.map((k,i)=>[k,i]) */                                           
    /* ); */                                                                    
    /* console.log(weights); */                                                 
                                                                                
function sortByOrder(data, order) {                                             
    const weight = Object.fromEntries(                                          
        // Pre-cache indexOf(...)                                               
        order.map((k,i)=>[k,i])                                                 
    );                                                                          
    return data.sort(                                                           
        ([a],[b])=>weight[a]-weight[b]                                          
    );                                                                          
};                                                                              
                                                                                
console.log(sortByOrder(data,order));                                           
                                                                                
// [ [ 'Hors', '', '' ],                                                        
//   [ 'TTC', '', '' ],                                                         
//   [ 'Total général', '', '' ],                                               
//   [ 'vergers', '  1 - 49 ch', '30 - 39 ch' ],                                
//   [ 'vergers', '  1 - 49 ch', '20 - 29 ch' ],                                
//   [ 'Comparable', '', '' ],                                                  
//   [ 'vergers', ' 50 - 99 ch', '70 - 79 ch' ],                                
//   [ 'vergers', '  1 - 49 ch', '40 - 49 ch' ],                                
//   [ ' Tra', '150 - 199 ch', '150 - 159 ch' ],                                
//   [ ' Tra', 'Total', '' ],                                                   
//   [ ' Tra', '500 - 999 ch', 'Total' ],                                       
//   [ ' Tra', '150 - 199 ch', '160 - 169 ch' ],                                
//   [ ' Tra', '100 - 149 ch', 'Total' ] ]