【问题标题】:LoDash challenges, I have an array of objects I need to filter, for an array of valuesLoDash 挑战,我有一组需要过滤的对象,用于一组值
【发布时间】:2015-04-06 03:14:20
【问题描述】:

我需要使用_id 值数组按_id 过滤以下对象数组。

var objects = [{
    _account: "YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo",
    _id:      "055z5gzVyVfzlBnEOqYvcoLL1ZgOWJhkrWMkv2"
}, {
    _account: "YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo",
    _id:      "LvvrvyrOGOS2e5yE0Bdki45Y1ndVlgfoZ2zoOp"
}, {
    _account: "mjj9jp92z2fD1mLlpQYZI1gAd4q4LwTKmBNLz",
    _id:      "rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61"
}, {
    _account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj",
    _id:      "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB"
}, {
    _account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj",
    _id:      "rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK"
}];

var id_values = [
    "rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK",
    "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB",
    "rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61"
];

我相信differencepullwithout 可能有用,但我无法将它们与 LoDash 上的文档区分开来。我也认为forEachforInuniq 可能有用。我能够使用reject 过滤掉其中一个对象:

_.reject(objects, {
    _id: "rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK"
});

这仍然不能帮助我解决按数组过滤的需要。结果应该是以下数组:

var result = [{
    _account: "YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo",
    _id:      "055z5gzVyVfzlBnEOqYvcoLL1ZgOWJhkrWMkv2"
}, {
    _account: "YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo",
    _id:      "LvvrvyrOGOS2e5yE0Bdki45Y1ndVlgfoZ2zoOp"
}];

【问题讨论】:

    标签: javascript arrays functional-programming lodash


    【解决方案1】:

    你可以试试关注

    var data = [{ _account: 'YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo',
        _id: '055z5gzVyVfzlBnEOqYvcoLL1ZgOWJhkrWMkv2'},
      { _account: 'YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo',
        _id: 'LvvrvyrOGOS2e5yE0Bdki45Y1ndVlgfoZ2zoOp'},
      { _account: 'mjj9jp92z2fD1mLlpQYZI1gAd4q4LwTKmBNLz',
        _id: 'rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61'},
      { _account: 'AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj',
        _id: '944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB'},
      { _account: 'AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj',
        _id: 'rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK' }];
    
    var ids = ['rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK', '944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB', 'rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61'];
    
    data = _.filter(data,function(obj){
        return ids.indexOf(obj._id) === -1;
    });
    
    console.log(data);
    

    Demo

    【讨论】:

    • 你的答案很完美!谢谢!
    • 使用indexOf 非常慢,因为它需要O(n) 时间来测试数组是否具有给定值。因此,如果data 的长度为m,那么代码的时间复杂度将为O(m * n),这非常糟糕。如果您对ids 进行索引,则可以测试该数组在O(1) 时间是否具有给定值。因此,O(m * n) 时间减少到O(m * 1) 时间。此外,创建索引需要O(n) 时间。因此,总时间复杂度为O(m + n),明显快于O(m * n)。有关详细信息,请参阅我的答案。
    【解决方案2】:

    这是我知道如何使用 LoDash 的最快方法:

    var objects = [{
        _account: "YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo",
        _id:      "055z5gzVyVfzlBnEOqYvcoLL1ZgOWJhkrWMkv2"
    }, {
        _account: "YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo",
        _id:      "LvvrvyrOGOS2e5yE0Bdki45Y1ndVlgfoZ2zoOp"
    }, {
        _account: "mjj9jp92z2fD1mLlpQYZI1gAd4q4LwTKmBNLz",
        _id:      "rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61"
    }, {
        _account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj",
        _id:      "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB"
    }, {
        _account: "AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj",
        _id:      "rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK"
    }];
    
    var id_values = [
        "rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK",
        "944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB",
        "rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61"
    ];
    
    var index  = index_of_array(id_values);
    
    var result = _.reject(objects, function (object) {
        return index[object._id] || false;
    });
    
    console.log(result);
    <script src="http://cdn.jsdelivr.net/lodash/2.1.0/lodash.compat.js"></script>
    
    <script>
    /*
      Creates an index of an array of keys. Allows you to check whether the array
      has a specific key in O(1) time (as compared to O(n) time using indexOf). It
      takes O(n) time to create the index where n is the length of the array.
    
      e.g.
    
      var keys  = [1,2,3];
      var index = index_of_array(keys);     //         O(n) time
      console.log(index[1] || false);       // true  - O(1) time
      console.log(index[4] || false);       // false - O(1) time
      console.log(keys.indexOf(1) >= 0);    // true  - O(n) time
      console.log(keys.indexOf(4) >= 0);    // false - O(n) time
    */
    
    function index_of_array(array) {
        var length = array.length
          , result = {}
          , index  = 0;
    
        while (index < length)
            result[array[index++]] = true;
        return result;
    }
    </script>

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2017-12-22
      • 2018-08-22
      • 2015-07-10
      • 2021-05-16
      • 2016-05-12
      • 1970-01-01
      相关资源
      最近更新 更多