【问题标题】:sorting an arrray with 2-3 nests javascript/lodash用 2-3 个嵌套对数组进行排序 javascript/lodash
【发布时间】:2018-04-19 12:04:20
【问题描述】:

无法理解如何对这种嵌套数组中包含数组的数据进行排序...

var data = {
   d1: [{
      nest1: {a:5, b:2},
      nest2: {a:3, b:1},
   }],
   d3: [{
      nest1: {a:7, b:9},
      nest2: {a:1, b:22},
   }],
   d2: [{
      nest1: {a:1, b:9},
      nest2: {a:11, b:22},
   }],
}

所以基本上,想按 a、b、key 排序。

所以首先,我已经迭代了所有对象以获得一个数组(能够按键排序)

现在数据看起来像(只是示例)

data = [{
   key: "d1",
   obj: [{
      nest1: {a:1, b:2},
      nest2: {a:3, b:12},
   }]}],
  [{
   key: "d2",
   obj: [{
      nest1: {a:11, b:12},
      nest2: {a:13, b:22},
   }]}]

所以现在我可以轻松地按键排序了 -

_.orderBy(vm.summaryData, 'key')

但还是一头雾水,怎么按​​data.obj.nest1.a排序??

期望:按key本身排序:

data = {
   d1: [{
      nest1: {a:5, b:2},
      nest2: {a:3, b:1},
   }],
   d2: [{
      nest1: {a:1, b:9},
      nest2: {a:11, b:22},
   }],
   d3: [{
      nest1: {a:7, b:9},
      nest2: {a:1, b:22},
   }],
}

期望:按nest1.a排序:

data = {
   d2: [{
      nest1: {a:1, b:9},
      nest2: {a:11, b:22},
   }],
   d1: [{
      nest1: {a:5, b:2},
      nest2: {a:3, b:1},
   }],
   d3: [{
      nest1: {a:7, b:9},
      nest2: {a:1, b:22},
   }],
}

期望:按nest2.a排序:

data = {
   d3: [{
      nest1: {a:7, b:9},
      nest2: {a:1, b:22},
   }],
   d1: [{
      nest1: {a:5, b:2},
      nest2: {a:3, b:1},
   }],
   d2: [{
      nest1: {a:1, b:9},
      nest2: {a:11, b:22},
   }],
}

等等...nest1.b、nest2.b.....

【问题讨论】:

  • 这种情况下的排序是什么意思?请添加更多示例或更多示例。
  • 好的,但是已经给出了例子/案例。
  • 数据不是有效的 javascript 对象
  • 抱歉错字,已更正。
  • 感谢 Nina,也添加了预期结果。

标签: javascript arrays sorting underscore.js lodash


【解决方案1】:

您可以将属性的路径用一个字符串进行排序,用点分隔进行排序。

function convert(object) {
    return Object
        .keys(object)
        .map(function (key) {
            return { key: key, obj: object[key] };
        });
}

var data = { d1: { nest1: { a: 1, b: 2 }, nest2: { a: 3, b: 12 } }, d2: { nest1: { a: 11, b: 1 }, nest2: { a: 13, b: 22 } } },
    result = convert(data);

console.log(_.orderBy(result, 'obj.nest1.b'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    JavaScript 对象没有顺序。试图对它们进行“排序”是没有意义的。但是,如果您使用排序键创建一个新对象,它将起作用。

    var data = {d1: [{nest1: {a:5, b:2},nest2: {a:3, b:1},}],d3: [{nest1: {a:7, b:9},nest2: {a:1, b:22},}],d2: [{nest1: {a:1, b:9},nest2: {a:11, b:22},}],};
    
    let sortData = (data, path) => {
      let sortedKey = !path ? Object.keys(data).sort() :
                     Object.keys(data).sort((ka,kb) => {
                     let key1 = path.split('.').reduce((o,i) => o[i],data[ka][0]),
                         key2 = path.split('.').reduce((o,i) => o[i],data[kb][0]);
                     return key1 - key2; 
                    });
    
       return sortedKey.reduce((r,k) => { r[k] = data[k]; return r; },{})
    }
    
    console.log(sortData(data));
    console.log(sortData(data,'nest1.a'));
    console.log(sortData(data,'nest2.a'));
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多