LoDash挑战,我有我需要过滤对象的数组,对值数组 [英] LoDash challenges, I have an array of objects I need to filter, for an array of values

查看:171
本文介绍了LoDash挑战,我有我需要过滤对象的数组,对值数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  VAR对象= {[
    _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
];

我相信区别可能是有用的,但我不能从LoDash文档区分它们。我也觉得的forEach forIn uniq的可能是有用的。我能够过滤的对象之一了使用拒绝

  _。拒绝(对象,{
    _id:rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK
});

不过这并不能帮助我需要通过一个数组进行筛选。结果应该是以下数组:

  VAR的结果= [{
    _account:YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo
    _id:055z5gzVyVfzlBnEOqYvcoLL1ZgOWJhkrWMkv2
},{
    _account:YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo
    _id:LvvrvyrOGOS2e5yE0Bdki45Y1ndVlgfoZ2zoOp
}];


解决方案

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

\r
\r

VAR对象= {[\r
    _account:YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo\r
    _id:055z5gzVyVfzlBnEOqYvcoLL1ZgOWJhkrWMkv2\r
},{\r
    _account:YzzrzBrO9OSzo6BXwAvVuL5dmMKMqkhOoEqeo\r
    _id:LvvrvyrOGOS2e5yE0Bdki45Y1ndVlgfoZ2zoOp\r
},{\r
    _account:mjj9jp92z2fD1mLlpQYZI1gAd4q4LwTKmBNLz\r
    _id:rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61\r
},{\r
    _account:AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj\r
    _id:944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB\r
},{\r
    _account:AaaraZrLqLfzRYoAPlb6ujPELWVW4dTK4eJWj\r
    _id:rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK\r
}];\r
\r
VAR id_values​​ = [\r
    rEEwENwnznCQvkm61wZ9uey62Pjy5YTqgYGDK\r
    944r40rPgPU2nXqzMYolS5nyo6Eo9OuqrlDkB\r
    rEEwENwnznCQvkm61wRziKlMRPqaYztnR4vn61\r
];\r
\r
VAR指数= index_of_array(id_values​​);\r
\r
VAR的结果= _.reject(对象,函数(对象){\r
    回报指数[object._id] ||假;\r
});\r
\r
的console.log(结果);

\r

&LT;脚本SRC =htt​​p://cdn.jsdelivr.net/lodash /2.1.0/lodash.compat.js\"></script>\r
\r
&LT;脚本&GT;\r
/ *\r
  创建键阵列的索引。允许您检查数组是否\r
  在O(1)时间特定的键(相对于o使用的indexOf(n)的时间)。它\r
  需要O(n)的时间来创建其中n是阵列的长度的索引。\r
\r
  例如\r
\r
  变种键= [1,2,3];\r
  VAR指数= index_of_array(键); // 准时\r
  的console.log(指数[1] ||假); //真 - O(1)时间\r
  的console.log(指数[4] ||假); //假 - O(1)时间\r
  的console.log(keys.indexOf(1)&GT = 0); //真 - O(n)的时间\r
  的console.log(keys.indexOf(4)&GT = 0); //假 - O(n)的时间\r
* /\r
\r
功能index_of_array(阵列){\r
    VAR长度= array.length\r
      ,结果= {}\r
      ,索引= 0;\r
\r
    而(指数&LT;长度)\r
        结果[数组[索引++] = TRUE;\r
    返回结果;\r
}\r
&LT; / SCRIPT&GT;

\r

\r
\r

希望有所帮助。

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

解决方案

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.

这篇关于LoDash挑战,我有我需要过滤对象的数组,对值数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆