使用lodash从数组中过滤冗余对象

jcb*_*cbp 9 javascript lodash

数据

var ranges = [
        { start: 2, end: 5 },
        { start: 8, end: 12 },
        { start: 15, end: 20 },
        { start: 9, end: 11 },
        { start: 2, end: 6 }
    ];
Run Code Online (Sandbox Code Playgroud)

每个对象代表一个范围.我需要删除包含在另一个中的范围.也就是说,在两个冗余对象之间我需要保持更长的范围.

我写了这段代码,但我想知道是否有更好的方法来实现这个使用lodash.

var Range = {
    contains: function(r1, r2) {
        return r2.start >= r1.start && r2.end <= r1.end;
    }
};

var result = _.chain(ranges)
    .filter(function(r2) {
        return !_.some(ranges, function(r1) {
            return r1 != r2 && Range.contains(r1, r2);
        });
    })
    .value();

console.log(result);
Run Code Online (Sandbox Code Playgroud)

产量

[
    { start: 8, end: 12 },
    { start: 15, end: 20 },
    { start: 2, end: 6 }
]
Run Code Online (Sandbox Code Playgroud)

jcb*_*cbp 3

我终于找到了一种使用uniqWith实现此目的的简单方法。

var result = _.chain(ranges)
    .orderBy(['end'], ['desc'])
    .uniqWith(function(r1, r2) {
        return Range.contains(r2, r1);
    })
    .value();
Run Code Online (Sandbox Code Playgroud)

  • 我没有做性能测试,但我意识到只运行 `Range.contains()` 8 次而不是 25 次。 (2认同)