使用lodash对包含文档的数组进行排序

时间:2017-03-15 15:15:25

标签: javascript arrays sorting lodash

我有一个包含文档数组的数组,可以帮助我如何使用数组中的多个文档对这些数组进行排序。用户可以选择要搜索的类型。如果他们可以选择'A'按类型'A'关联的值对所有数组项进行排序,对其他类型也是如此。做这个的最好方式是什么。 Lodash解决方案将非常有益。这些值可以是整数/字符串/ guids / datetime字段。

Type始终是一个字符串,无论如何我认为它确实不重要。

[
 [{type:A, value:10},{type:B, value:20},{type:C, value:15},{type:D, value:20}],
 [{type:A, value:5},{type:B, value:10},{type:C, value:35},{type:D, value:40}],
 [{type:A, value:30},{type:B, value:30},{type:C, value:25},{type:D, value:30}],
 [{type:A, value:20},{type:B, value:50},{type:C, value:55},{type:D, value:10}]
]

如果按类型'A'排序,则需要输出

[[{type:A, value:5},{type:B, value:10},{type:C, value:35},{type:D, value:40}],
     [{type:A, value:10},{type:B, value:20},{type:C, value:15},{type:D, value:20}],
     [{type:A, value:20},{type:B, value:50},{type:C, value:55},{type:D, value:10}],
     [{type:A, value:30},{type:B, value:30},{type:C, value:25},{type:D, value:30}]]

3 个答案:

答案 0 :(得分:2)

在普通的Javascript中,您可以查找给定的类型并按相应的值排序。



function sort(data, type) {
    function getValue(array) {
        var value = -Number.MAX_VALUE;
        array.some(function (o) {
            if (o.type === type) {
                value = o.value;
                return true;
            }
        });
        return value;
    }

    data.sort(function (a, b) {
        var aa = getValue(a),
            bb = getValue(b);
        return isFinite(aa) && isFinite(bb) ? aa - bb : aa.localeCompare(bb);
    });
}


var data = [[{ type: 'A', value: 10 }, { type: 'B', value: 20 }, { type: 'C', value: 15 }, { type: 'D', value: 'b' }], [{ type: 'A', value: 5 }, { type: 'B', value: 10 }, { type: 'C', value: 35 }, { type: 'D', value: 'a' }], [{ type: 'A', value: 30 }, { type: 'B', value: 30 }, { type: 'C', value: 25 }, { type: 'D', value: 'd' }], [{ type: 'A', value: 20 }, { type: 'B', value: 50 }, { type: 'C', value: 55 }, { type: 'D', value: 'c' }]];

sort(data, 'A');
console.log(data);
sort(data, 'D');
console.log(data);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 1 :(得分:2)

以下是使用sortBy进行排序的lodash解决方案,find使用特定type获取相应的值。

var result = _.sortBy(data, function(item) {
  return _.find(item, { type: 'A' }).value;
});

var data = [
  [{
    type: 'A',
    value: 10
  }, {
    type: 'B',
    value: 20
  }, {
    type: 'C',
    value: 15
  }, {
    type: 'D',
    value: 20
  }],
  [{
    type: 'A',
    value: 5
  }, {
    type: 'B',
    value: 10
  }, {
    type: 'C',
    value: 35
  }, {
    type: 'D',
    value: 40
  }],
  [{
    type: 'A',
    value: 30
  }, {
    type: 'B',
    value: 30
  }, {
    type: 'C',
    value: 25
  }, {
    type: 'D',
    value: 30
  }],
  [{
    type: 'A',
    value: 20
  }, {
    type: 'B',
    value: 50
  }, {
    type: 'C',
    value: 55
  }, {
    type: 'D',
    value: 10
  }]
];

var result = _.sortBy(data, function(item) {
  return _.find(item, { type: 'A' }).value;
});

console.log(result);
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

答案 2 :(得分:0)

您可以使用闭包动态创建关系进行排序。

function sortBy(key){
    return function(a,b){
        return a[key] - b[key];
    }
}

var index = {'A':0, 'B': 1, … };
var userPickedType = 'A';
yourarray.sort(sortBy(index[userPickedType]));
相关问题