我有两个数组:
a = [2,2,3,0,6]
b = [6,3,2,2,0]
我正在尝试使用for循环来匹配值并获取新数组c中的a的索引。我们应该怎么做?请注意,有多个值匹配,因此我认为必须跳过上一个匹配。
答案 0 :(得分:1)
这是一个尊重最后一个索引并进一步展望的提案。
工作原理:
它使用
Array#map
通过回调迭代数组b
。 map获取一个自己的this
空格,其中包含一个非常空的对象Object.create(null)
。回调有参数
的一个元素bb
,它是`b。接下来是根据以前的搜索,找到包含
Array#indexOf
和a
的数组fromIndex
中的元素。前一个索引存储在this
对象中,只要结果不是-1
,因为这会将fromIndex
重置为零。如果没有
this[bb]
或虚假值this[bb]
,则将零视为fromIndex
。稍后,找到的
index
会增加并存储在this[bb]
。至少会返回索引。
var a = [2, 2, 3, 0, 6],
b = [6, 3, 2, 2, 0],
c = b.map(function (bb) {
var index = a.indexOf(bb, this[bb] || 0);
if (index !== -1) {
this[bb] = index + 1;
}
return index;
}, Object.create(null));
console.log(c);

另一个解决方案可能是首先生成一个所有索引为a
的对象,并在b
的迭代中使用它来返回索引。
示例有点扩展,以显示如果不超过两个索引(2)且一个不在a
(7)中会发生什么。
aObj的内容,所有索引均为
a
:{ "0": [3], "2": [0, 1], "3": [2], "6": [4] }
var a = [2, 2, 3, 0, 6],
b = [6, 3, 2, 2, 0, 7, 2],
aObj = Object.create(null),
c;
a.forEach(function (aa, i) {
aObj[aa] = aObj[aa] || [];
aObj[aa].push(i);
});
c = b.map(function (bb) {
return aObj[bb] && aObj[bb].length ? aObj[bb].shift() : -1;
});
console.log(c);

答案 1 :(得分:0)
如果我理解正确的话。
let c = a.map(i => b.indexOf(i))
或
var c = a.map(function(i) { return b.indexOf(i); });
答案 2 :(得分:0)
据我所知,你可以试试这个:
var a = [2,2,3,0,6];
var b = [6,3,2,2,0];
var c = new Array();
for(i = 0; i < b.length; i++)
{
for(j = 0; j < a.length; j++)
{
if(b[i] === a[j] && c.indexOf(j) < 0)
{
c.push(j);
break;
}
}
}
console.log(c); // [4, 2, 0, 1, 3]
答案 3 :(得分:0)
循环.map
函数,并按indexOf
indexOf将返回一个数字,表示第一次出现指定搜索值的位置,如果永远不会出现,则返回-1
var arr = [];
a.map(function(v){
if(b.indexOf(v) > -1){
arr.push(v);
}
});
console.log(arr);
答案 4 :(得分:0)
尝试这样的事情
var a = [2,2,3,0,6];
var b = [6,3,2,2,0];
var arrayLength_a = a.length;
var arrayLength_b = b.length;
var new_array=[];
for (var i = 0; i < arrayLength_a; i++)
{
for (var j = 0; j < arrayLength_b; j++)
{
if (a[i] == b[j])
{
if(new_array.indexOf(a[i]) === -1)
{
new_array.push(a[i]);
}
}
}
}