根据另一个的相应值获取数组的元素 - Lodash

时间:2016-09-13 08:02:09

标签: javascript arrays underscore.js lodash

我有两个JavaScript数组:

 window.sqlitePlugin.openDatabase({name: 'test.db', location: 'default'});

 setTimeout(function(){
tx.executeSql('CREATE TABLE IF NOT EXISTS test (loc_emp_lat, loc_emp_long, loc_emp_accuracy, loc_emp_local_time)');

},4000);

我希望另一个数组从array1获取元素,其中数组2的相应元素在同一位置匹配条件。两个数组必须具有相同的元素。

例如: 我想要array1的元素,其中array2的相应元素是0

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

另一个例子: 我想要array1的元素,其中array2的相应元素是1

Result = ['b','c']

我在Lodash或Underscore Js Libraries上寻找一个功能来执行此操作。我可以使用vanilla javascript来实现它,但我很想知道是否可以使用这些库来完成。

4 个答案:

答案 0 :(得分: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>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

这可以通过在lodash中添加以下方法来优雅地完成:

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

基本上,它返回一个迭代数组的函数,也就是说,每次调用都会返回下一个数组元素。使用iter,您的问题很简单:

&#13;
&#13;
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)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分: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();

答案 3 :(得分: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))