获取另一个数组中包含的数组元素的索引的简明方法?

时间:2015-01-30 14:23:17

标签: javascript jquery

我有两个数组ab,例如

var a = [1,2,3,4];
var b = [2,4];

我想获取a中包含的b元素的索引。我可以使用循环,比如

var ii = [];
for (var i=0; i < x.length; i++)
{
    if (y.indexOf(x[i]) >= 0)
        ii.push(i);
};

这很有效。但是来自R语言,这只是which(a %in% b),我想我会有更简洁的方法来获得我想要的JS。建议? TIA:)

5 个答案:

答案 0 :(得分:2)

您可以使用Array.map

缩短时间
var idx = b.map(function(n){ return a.indexOf(n) }).filter(function(n){ 
    return n != -1
})

答案 1 :(得分:0)

总会出现某种形式的循环,无论是直接写入还是隐含于对Array.map()等的调用。那个方法并不多。

但是,您不应该编写该代码。像LodashUnderscore这样的库有一个名为intersection()的方法,它可以完成大部分工作 - 可能有两个以上的数组:

_.intersection([1, 2, 3], [5, 2, 1, 4], [2, 1]);
// → [1, 2]

对于从a获取索引的具体情况,您可以将intersection()的输出链接到map()

var a = [1,2,3,4];
var b = [2,4];

var result = _.intersection(a, b).map(function (v) {
    return a.indexOf(v);
});

console.log(result);
// → [1, 3]

答案 2 :(得分:0)

Lodash还提供可以轻松实现这一目标的工具。如果您喜欢使用外部库:

var a = [1,2,3,4];
var b = [2,4];

var intersection = _.intersection(a,b);

_.forEach(intersection, function(item){
    console.log(a.indexOf(item));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script>

但纯粹的香草解决方案看起来像:

var a = [1,2,3,4];
var b = [2,4];

function intersection(a, b)
{
  var ai=0, bi=0;
  var result = new Array();

  while( ai < a.length && bi < b.length )
  {
     if      (a[ai] < b[bi] ){ ai++; }
     else if (a[ai] > b[bi] ){ bi++; }
     else /* they're equal */
     {
       result.push(a[ai]);
       ai++;
       bi++;
     }
  }

  return result;
}

var intersect = intersection(a,b);

intersect.forEach(function(item){
    console.log(a.indexOf(item));
});

答案 3 :(得分:0)

使用Array.reduce方法的解决方案

var a = [1,2,3,4];
var b = [2,4];

var idxs = b.reduce(function(l, r, idx) {
    var i = a.indexOf(r);
    return i > -1 ? (l.push(i), l) : l;
}, []);

console.log(idxs);

答案 4 :(得分:0)

这可以通过映射数组a来返回其索引或空字符串 -

过滤Numbers的地图仅返回索引。

但是你的原始脚本效率更高,值得下载几个字节。

var a = [1,2,3,4];
var b = [2,4];

var a_in_b=a.map(function(itm,i){ return b.indexOf(itm)!=-1? i:''}).filter(Number);

/ * a_in_b value :(数组)[1,3]; * /