2016-09-13 9 views
1

Iは、2つのJavaScriptの配列を有する:取得要素 - Lodash

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

Iが別の配列が同じ位置マッチAにアレイ2の対応する要素ARRAY1から要素を取得したいです調子。どちらの配列も同じ要素を持たなければなりません。

例えば

: Iは、配列2の対応する要素が1

Result = ['a','d'] 
ある配列1の要素をしたい:私は配列2の対応する要素は、別の例0

Result = ['b','c'] 

ある配列1の要素が必要

私はこれを行うにはLodashまたはUnderscore Jsライブラリの関数を探しています。私はvanilla 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(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

関連する問題