вернуть массив из сравнения с массивами _ lodash - PullRequest
0 голосов
/ 16 апреля 2019
let a =  [{
    a:1,
    b:3,
    c:[1, 2, 6]
    },
 {
    a:3,
    b:10,
    c:[2, 5, 4]
    },
 {
    a:4,
    b:3,
    c:[7, 12, 6]
    },
 {
    a:4,
    b:12,
    }]

let b = [2, 6]

Я хочу вернуть массив из a объекта, который соответствует b массивам.

Я использовал:

lodash.forEach(b , (value)=>{
   lodash.filter(a, {c: value})
}

но это не работает. Я попытался упростить мой код для лучшего понимания.

Ответы [ 4 ]

1 голос
/ 16 апреля 2019

Чтобы найти объекты с c, содержат все b значения, которые вы можете использовать Array.filter() и Array.every():

let a =  [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }];

    let b = [2, 6]

    console.log(a.filter(({c = []}) => b.every(v => c.includes(v)))); 

, если вы хотите использовать общие значения, используйте Array.some() вместо Array.every():

let a =  [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }];

        let b = [2, 6]

        console.log(a.filter(({c = []}) => b.some(v => c.includes(v)))); 
1 голос
/ 16 апреля 2019

Вы можете отфильтровать массив, посмотрев, включены ли значения b в c.

var a = [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }],
    b = [2, 6],
    result = a.filter(({ c = [] }) => b.some(v => c.includes(v)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Для получения только полностью совпадающих предметов вы можете использовать Array#every вместо Array#some.

var a = [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }],
    b = [2, 6],
    result = a.filter(({ c = [] }) => b.every(v => c.includes(v)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 16 апреля 2019

Я считаю, что это то, что вы хотите - вы можете сделать это в чистом JS:

 

let a =  [{
a:1,
b:3,
c:[1, 2, 6]
},
 {
a:3,
b:10,
c:[2, 5, 4]
},
 {
a:4,
b:3,
c:[7, 12, 6]
},
 {
a:4,
b:12,
}]

let b = [2, 6]

let c = a.filter(({ c = [] }) => c ? b.some(n => c.includes(n))) : false;

console.log(c);
0 голосов
/ 16 апреля 2019

Предполагается, что вы хотите отфильтровать объекты в массиве a, которые имеют по крайней мере одно значение в c, которое существует в массиве b.

Вы можете использовать Array.filter , Array.some & Array.includes

let a=[{a:1,b:3,c:[1,2,6]},{a:3,b:10,c:[2,5,4]},{a:4,b:3,c:[7,12,6]},{a:4,b:12,}];
let b=[2,6];

let result = a.filter(v => v.c && v.c.some(v1 => b.includes(v1)));
console.log(result);

Вы можете использовать lodash следующим образом

let a=[{a:1,b:3,c:[1,2,6]},{a:3,b:10,c:[2,5,4]},{a:4,b:3,c:[7,12,6]},{a:4,b:12,}];
let b=[2,6];

let result = _.filter(a, v => v.c && _.some(v.c, c => _.includes(b,c)));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...