我有两个数组a
和b
,例如
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:)
答案 0 :(得分:2)
您可以使用Array.map
var idx = b.map(function(n){ return a.indexOf(n) }).filter(function(n){
return n != -1
})
答案 1 :(得分:0)
总会出现某种形式的循环,无论是直接写入还是隐含于对Array.map()
等的调用。那个方法并不多。
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]; * /