最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to filter multi-condition with Lodash _.filter? - Stack Overflow

programmeradmin4浏览0评论

I want to filter two obj from the collections, the conditionArr fetch from Server, so it's unpredictable.

My code is:

var users = [{
        user: 'barney',
        age: 36,
        active: true
    },
    {
        user: 'fred',
        age: 40,
        active: false
    },
    {
        user: 'travis',
        age: 37,
        active: true
    }
];

// the Array fetch from Server, so it's unpredictable.
var conditionArr = [{
    user: 'barney'
}, {
    user: 'fred'
}];

// _.filter
result = _.filter(users, conditionArr);

My expected output:

 // expect results:
 [{
         user: 'barney',
         age: 36,
         active: true
     },
     {
         user: 'fred',
         age: 40,
         active: false
     }
 ]  

real results:

[]

thx.


I found a better method:

result =  _.map(conditionArr, (con) => ({
    ...con,
   ...(_.find(users, { user: con.user })),
}))

thx...

I want to filter two obj from the collections, the conditionArr fetch from Server, so it's unpredictable.

My code is:

var users = [{
        user: 'barney',
        age: 36,
        active: true
    },
    {
        user: 'fred',
        age: 40,
        active: false
    },
    {
        user: 'travis',
        age: 37,
        active: true
    }
];

// the Array fetch from Server, so it's unpredictable.
var conditionArr = [{
    user: 'barney'
}, {
    user: 'fred'
}];

// _.filter
result = _.filter(users, conditionArr);

My expected output:

 // expect results:
 [{
         user: 'barney',
         age: 36,
         active: true
     },
     {
         user: 'fred',
         age: 40,
         active: false
     }
 ]  

real results:

[]

thx.


I found a better method:

result =  _.map(conditionArr, (con) => ({
    ...con,
   ...(_.find(users, { user: con.user })),
}))

thx...

Share Improve this question edited Apr 12, 2020 at 3:37 Penny Liu 17.4k5 gold badges86 silver badges108 bronze badges asked Mar 23, 2018 at 11:36 ycjcl868ycjcl868 5583 gold badges7 silver badges19 bronze badges
Add a ment  | 

6 Answers 6

Reset to default 7

Use _.intersectionBy():

const users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"travis","age":37,"active":true}];

const conditionArr = [{"user":"barney"},{"user":"fred"}];

const result = _.intersectionBy(users, conditionArr, 'user');

console.log(result);
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

Vanilla JS - I've added a simple intersectionBy() that converts the relevant key values of the 2nd array to a Set. Then you can filter the 1st array using the Set.

const intersectionBy = (arr1, arr2, key) => {
  const keys = new Set(arr2.map(o => o[key]));
  
  return arr1.filter(o => keys.has(o[key]));
};

const users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"travis","age":37,"active":true}];

const conditionArr = [{"user":"barney"},{"user":"fred"}];

const result = intersectionBy(users, conditionArr, 'user');

console.log(result);

Just use array.filter:

var users = [
 { user: 'barney', age: 36, active: true },
 { user: 'fred',  age: 40, active: false },
 { user: 'travis', age: 37, active: true}
];

var result = users.filter(({user}) => user === 'barney' || user === "fred");
console.log(result);

Like many other lodash functions, _.filter takes function as 2nd parameter (with each element in array as a parameter), if the function return true, then that element is kept in the result.

var users = [
     { user: 'barney', age: 36, active: true },
     { user: 'fred', age: 40, active: false },
     { user: 'travis', age: 37, active: true }
 ];

// the Array fetch from Server, so it's unpredictable.
var conditionArr = [
  { user: 'barney'},
  { user: 'fred'}
];
 
 // Simplified condition a bit. cond = ['barney', 'fred'];
var cond = _.map(conditionArr, cond => cond.user);
 
 // _.filter
var result = _.filter(users, user => _.indexOf(cond, user.user) !== -1);

console.log('result', result);
<script src="https://cdn.jsdelivr/npm/[email protected]/lodash.min.js"></script>

If you have to achieve this with lodash you can do in the same way like array.filter

_.filter(users, ({user}) => user === 'barney' || user === 'fred');

In _.filter method you need to pass function like below example

_.filter(users, function(o) { return !o.active; });

var users = [{
    user: 'barney',
    age: 36,
    active: true
  },
  {
    user: 'fred',
    age: 40,
    active: false
  },
  {
    user: 'travis',
    age: 37,
    active: true
  }
];


// _.filter
var result = _.filter(users, function(obj) { return obj.user=='barney'||obj.user=='fred' });

console.log(result)
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.17.5/lodash.core.js"></script>

use native js like -

let userSubset = users.map(function(obj, index) {

   if (obj.user === "barney" || obj.user === "fred") return obj;
}).filter(Boolean);

console.log(userSubset);

// {user: "barney", age: 36, active: true}
// {user: "fred", age: 40, active: false}
发布评论

评论列表(0)

  1. 暂无评论