2016-09-13 3 views
1

У меня есть два JavaScript массива:Получение элементов массива в зависимости от соответствующих значений другой - Lodash

var array1 = ['a','b','c','d']; 
var array2 = [ 1, 0, 0, 1 ]; 

Я хочу еще один массив, получая элементы из array1, где соответствующие элементы массива 2 в том же положении Совпадение состояние. Оба массива должны иметь одинаковые элементы.

Например: Я хочу элементы array1, где соответствующие элементы массив2 являются 0

Result = ['b','c'] 

Другой пример: Я хочу элементы array1, где соответствующие элементы массив2 являются 1

Result = ['a','d'] 

Я ищу функцию для Lodash или Underscore Js Libraries для этого. Я могу реализовать его с помощью ванильного javascript, но мне любопытно узнать, можно ли это сделать с этими библиотеками.

ответ

2

Это то же самое, что и в простом Javascript.

filtered0 = array1.filter((_, i) => array2[i] === 0); 
filtered1 = array1.filter((_, i) => array2[i] === 1); 

var array1 = ['a','b','c','d'], 
 
    array2 = [ 1, 0, 0, 1 ]; 
 

 
console.log(_.filter(array1, (a, i) => array2[i] === 0)); 
 
console.log(_.filter(array1, (a, i) => array2[i] === 1));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

+0

Работает !, Большое спасибо. Для знатоков EC6 это код: – rtrujillor

+0

console.log (_. Filter (array1, function (a, i) {return array2 [i] === 0})); – rtrujillor

1

Вы можете создать пользовательскую функцию и использовать filter() но оба массива должны быть одинаковой длины.

var array1 = ['a', 'b', 'c', 'd']; 
 
var array2 = [1, 0, 0, 1]; 
 

 
function filterBy(el) { 
 
    return array1.filter(function(e, i) { 
 
    return array2[i] == el; 
 
    }) 
 
} 
 

 
console.log(filterBy(0)) 
 
console.log(filterBy(1))

2

Это может быть сделано элегантно, добавив следующий метод lodash:

_.mixin({'iter': xs => (w =>() => w.next().value)(_(xs))}) 

В основном, она возвращает функцию, которая итерирует массив, то есть, каждый вызов возвращает следующий элемент массива. С iter, ваша задача проста:

var array1 = ['a','b','c','d']; 
 
var array2 = [ 1, 0, 0, 1 ]; 
 

 
_.mixin({'iter': xs => (w =>() => w.next().value)(_(xs))}); 
 

 
// positives 
 

 
pos = _.filter(array1, _.iter(array2)) 
 
console.log(pos) 
 

 
// negatives 
 

 
neg = _.reject(array1, _.iter(array2)) 
 
console.log(neg) 
 

 
// both 
 

 
group = _.groupBy(array1, _.iter(array2)) 
 
console.log(group)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

+0

Прохладный. Это больше всего мне нужно, но большой вклад! Благодарю. – rtrujillor

2

Вы можете zip(), filter() и map(), как это:

_.chain() 
    .zip(array1, array2) 
    .filter(_.property(1)) 
    .map(0) 
    .value(); 

Вы можете получить нулевые значения, отрицая фильтр предикат, например:

_.chain() 
    .zip(array1, array2) 
    .filter(_.negate(_.property(1))) 
    .map(0) 
    .value(); 
+1

Или проще: '_ (array1) .zip (array2) .reject (1) .map (0) .value()' – georg

 Смежные вопросы

  • Нет связанных вопросов^_^