【问题标题】:Javascript sorting list of arraylist of object - based on specfic arraylist对象的arraylist的Javascript排序列表-基于特定的arraylist
【发布时间】:2016-07-18 04:08:25
【问题描述】:

如果我有 Javascript 对象:

var myObject = {
dataset : [],
};

myObject.dataset.push({data : [1,5,4,6]});
myObject.dataset.push({data : [2,4,7,4]});
myObject.dataset.push({data : [12,53,4,45]});

然后我想仅基于特定的数据集 ALL 对 datasets.data BUT 进行排序。 fx 第一个。 myObject.dataset[0].data

预期结果:

0 : ({data : [1,4,5,6]}); // sorted list
1 : ({data : [2,7,4,4]}); // others match the changes.
2 : ({data : [12,4,53,45]});

类似:

for(i = 0; i < myObject.dataset.length; i++) {
  myObject.dataset[i].data.sort( BASED ON myObject.dataset[0].data )
}

小提琴:https://jsfiddle.net/Lc7bn7hq/

【问题讨论】:

    标签: javascript sorting arraylist


    【解决方案1】:

    应该这样做。我添加了 cmets 以显示发生了什么...

    var something = {
        dataset: [],
    };
    
    
    something.dataset.unshift({data : [1,5,4,6]});
    something.dataset.unshift({data : [1,5,8,6]});
    something.dataset.unshift({data : [2,4,7,4]});
    something.dataset.unshift({data : [12,53,4,45]});
    something.dataset.unshift({data : [11,52,41,16]});
    something.dataset.unshift({data : [1,53,43,64]});
    something.dataset.unshift({data : [1,5,8,6,3]});
    
    //This function is used when sorting two cells in an array
    //See the Array.prototype.sort method on MDN for more info
    //Returning -1 keeps (a,b)->(a,b), returning 1 swaps (a,b)->(b,a)
    var asc = function(a,b) {return a<b?-1:1; };
    
    //Sort the whole dataset, based on the values of each array
    something.dataset.sort(function(a,b) {
    
      //The arguments a and b are cell objects in something.dataset
      //Sort each of the data arrays for the objects
      a.data.sort(asc);
      b.data.sort(asc);
    
      //Tricky part is if a.data[0] and b.data[0] are equal
      //Find the first cell of both arrays that are not equal
      var i=0; 
      var al = a.data.length;
      var bl = b.data.length
      var l=Math.min(al,bl);
      while(i<l && a.data[i]===b.data[i]) i++;
    
      //All the values for the shortest of both arrays are equal! Sort by the length of the arrays instead
      if(i>=l) return asc(al,bl);
    
      //We found a non-equal cell in both arrays, sort by it!
      return asc(a.data[i],b.data[i]);
    
    });
    
    console.log(JSON.stringify(something));
    

    【讨论】:

    • 非常感谢,您介意通过添加 cmets 来解释一些代码吗? fx asc 函数
    • 我添加了一些 cmets - 我希望它能解决问题。 Javascript 中的原生数组排序很古怪,所以我建议在这里阅读:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 当然可以,非常感谢您花费时间和精力来评论/解释
    • 我从这个小提琴中注意到的一件事:jsfiddle.net/Lc7bn7hq/2 是订单改变了吗?可以避免吗
    • 啊,可以。数组排序是一种可变方法。要保持顺序但执行比较,您可以这样做: var c=a.slice(); c.sort(asc); var d=b.slice(); d.sort(asc); ...然后比较 c 和 d 值。
    【解决方案2】:

    此解决方案将数据重新洗牌到一个新的数组数组中,对它们进行排序并将数据移回:

     var regrouped=[];
    
     for (var i=0; i<myObject.dataset[0].data.length; i++) {
        regrouped.push([]);
     }
    
         for (var j=0; j<myObject.dataset[0].data.length; j++) {   
        for (i=0; i<myObject.dataset.length; i++) {
           regrouped[j][i]=myObject.dataset[i].data[j];
        }
     }
    
     regrouped.sort(function(a,b){return a[0]-b[0];});
    
     for (i=0; i<myObject.dataset.length; i++) {
        for (j=0; j<myObject.dataset[0].data.length; j++) {   
           myObject.dataset[i].data[j]=regrouped[j][i];
        }
     }
    

    【讨论】:

      【解决方案3】:

      如果你愿意使用 lodash 或 underscore js 库。你可以使用这个 lodash 函数来非常简单优雅地实现你想要的。

       var something = {
          dataset: [],
      };
      
      
      something.dataset.unshift({data : [1,5,4,6]});
      something.dataset.unshift({data : [2,4,7,4]});
      something.dataset.unshift({data : [12,53,4,45]});
      something.dataset.unshift({data : [11,52,41,16]});
      something.dataset.unshift({data : [1,53,43,64]});
      
      
      _.forEach(something.dataset, function(data){
                   console.log(data.data);
                 data.data =  _.sortBy(data.data);
       });
      
      console.log(something);
      

      【讨论】:

      • 我不认为这是问题中的问题。
      • 就像替代先生!
      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2018-04-21
      • 1970-01-01
      • 2017-06-26
      相关资源
      最近更新 更多