LoDash challenges, I have an array of objects I need to filter, for an array of values

﹥>﹥吖頭↗ 提交于 2019-12-11 09:46:50

问题


I have the following array of objects that I need to filter by _id using an array of _id values.

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"
];

I believe that difference, pull or without could be useful but I can't tell them apart from the documentation on LoDash. I also think forEach, forIn or uniq could be useful. I was able to filter one of the objects out using reject:

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

Still this does not help me with the need to filter by an array. The result should be the following array:

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

回答1:


This is the fastest way I know how to do it using 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>

Hope that helps.




回答2:


Can you just try following

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



来源:https://stackoverflow.com/questions/28357971/lodash-challenges-i-have-an-array-of-objects-i-need-to-filter-for-an-array-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!