【问题标题】:Sort object array based on another array of keys根据另一个键数组对对象数组进行排序
【发布时间】:2016-04-14 09:52:35
【问题描述】:

我有两个包含对象的数组。一个包含某种顺序的键,另一个包含数据,我需要按照给定的排序键数组对数据数组进行排序。我该怎么做?

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

结果应该是:

result = [{d:4},{a:1},{b:2},{c:3]

【问题讨论】:

标签: javascript jquery


【解决方案1】:

试试这个

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

b.sort(function(x,y){
  var xkey = a.indexOf(Object.keys(x)[0]);
  var ykey = a.indexOf(Object.keys(y)[0]);
  return xkey - ykey;
})

document.body.innerHTML += JSON.stringify(b,0,4);

【讨论】:

    【解决方案2】:

    与上述不同的方法是使用Lodash Javascript 库。

    var a = ['d','a','b','c'] ;
    var b =  [{a:1},{c:3},{d:4},{b:2}];
    
    var results = _.map(a,function(av) {
       var obj = {};
       obj[av] = _.find(b, av)[av];
       return obj
    });
    
    document.body.innerHTML += JSON.stringify(results);
    <script src="https://cdn.jsdelivr.net/lodash/4.11.1/lodash.min.js"></script>

    【讨论】:

      【解决方案3】:

      这应该可以解决问题

      result = a.map(function(key) {
          for(var i=0; i<b.length; ++i) {
              if(key in b[i]) return b[i];
          }
      });
      

      【讨论】:

        【解决方案4】:

        这种方法尊重数组对象中的键进行排序。

        a 的项目用于查找及其各自的顺序。

        在这种情况下,d 获取 b 项目的所有排序值,所以 d 看起来像

        [ 1, 3, 0, 2 ]
        

        在使用索引排序时,我们需要e,它只有b的索引

        [ 0, 1, 2, 3 ]
        

        排序后变成了

        [ 2, 0, 3, 1 ]
        

        想要的排序顺序。现在原始数组被重新映射到新的顺序。

        但是为什么呢?

        通常对象包含多个属性。如果你使用Object.keys 并且只取第一个元素,那么你可能会出错,因为这个元素不是获取排序顺序的所需元素。

        要使其保存,您需要一种不同的方法,它不会将Array#indexOfObject.keys 的固定项结合使用。

        var a = ['d', 'a', 'b', 'c'],
            b = [{ a: 1 }, { c: 3 }, { d: 4 }, { b: 2 }],
            d = b.map(function (bb) {
                var k = -1;
                a.some(function (aa, i) {
                    if (aa in bb) {
                        k = i;
                        return true;
                    }
                });
                return k;
            }),
            e = b.map(function (_, i) { return i; });
        
        e.sort(function (a, b) {
            return d[a] - d[b];
        });
        
        b = e.map(function (a) {
            return b[a];
        });
        
        document.write('<pre> ' + JSON.stringify(b, 0, 4) + '</pre>');

        【讨论】:

          【解决方案5】:

          蛮力方法是遍历每个数组并检查 b 数组是否存在。

          var a = ['d','a','b','c'] ;
          var b =  [{a:1},{c:3},{d:4},{b:2}];
          
          var ans = [];
          
          for(var i = 0; i < a.length; ++i)
          {
           for(var j = 0; j < b.length; ++j)
           {
             if(b[j][a[i]])
               ans.push(b[j]);
           }
          }
          document.write(JSON.stringify(ans, 0, 4));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-11-20
            • 2016-06-02
            • 1970-01-01
            • 1970-01-01
            • 2021-04-05
            • 2018-02-09
            相关资源
            最近更新 更多