javascript - LoDash 挑战,我有一组需要过滤的对象,用于一组值

标签 javascript arrays functional-programming lodash

我有以下对象数组,我需要使用 _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"
}];

最佳答案

这是我所知道的使用 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>

希望对您有所帮助。

关于javascript - LoDash 挑战,我有一组需要过滤的对象,用于一组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357971/

相关文章:

JavaScript 函数定义

javascript - 如果满足某些条件,则从 .on ("child_added".. 停止/突破

templates - 如何使用 C++ 模板传递函数及其签名(haskell 样式)?

javascript - 在 Bower 中指定版本号

r - 创建一个函数,通过将索引值作为 r 中的向量来查找列表中的值

c - 在符合 MISRA 的情况下在 C 中传递缓冲区

python - 获取numpy数组的对角线

Scala:用一些通用类型制作更高种类的类型

clojure - 是否应将延迟视为不可变值?

javascript - 如何让 Angular-bootstrap 弹出窗口显示字典值