如何使用另一个元素保存数组中元素的位置?

时间:2019-03-08 13:40:32

标签: javascript arrays

很难说清楚我的问题,但是我会在这里尝试更好地解释它。

我有三个数组:

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = [];

我希望使用 nums4 上的每个元素检查 nums 的每个元素,并将这些元素在 nums 上的位置压入 posiciones

这是我到目前为止所做的,但是我不知道为什么它不起作用:

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = [];
    var pos = nums.indexOf(nums4[0])

    for (var io = 0; pos != -1 ;)
    /*while (pos != -1)*/
    {
        posiciones.push(pos);
        if(nums4.indexOf(nums4[io], pos + 1) == -1)
        {
        io++;
        }
        pos = nums.indexOf(nums4[io],pos + 1);
    }

    for(var i = 0; i < posiciones.length; i++)
    {
        posiciones[i]++;
    }

由于英语不是我的母语,所以我不知道我是否清楚这个问题,但是如果您能向我解释该怎么做,我将不胜感激。

编辑:答案应该是:

var posiciones = [2, 3, 4, 5, 6, 7, 9, 10]

但代替它的是,代码提供的答案是:

var posiciones = [2, 3, 5, 10]

此外,我编辑了提供的数字,因为根据提供的数字和答案,我寻找了无法提供所需答案的数字。

3 个答案:

答案 0 :(得分:1)

(已针对您的新数据集进行了更新,但请注意,您的预期结果是错误的,应该为[1,2,3,4,5,6,8,9],除非您的逻辑与您所​​说的完全不同,请参见{{3 }}。如果您希望第一个条目位于“索引” 1​​而不是索引0,则在以下示例中保存索引时只需使用+ 1

  

我希望使用nums4上的每个元素检查nums的每个元素,并在posiciones上推送这些元素在nums上的位置。

对于这么小的数据集,对于nums4检查,我可能只使用includes。 (对于更大的数据集,我将制作一个Map或类似名称以避免不断重新扫描。)

对于主循环,也许是forEach

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = [];
nums.forEach((value, index) => {
    if (nums4.includes(value)) {
        posiciones.push(index);
    }
});

console.log(posiciones);

或者以“索引”开头1而不是0:

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = [];
nums.forEach((value, index) => {
    if (nums4.includes(value)) {
        posiciones.push(index + 1); // + 1 to make it 1-based
    }
});

console.log(posiciones);


或者只是一个简单的for循环:

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = [];
for (let index = 0; index < nums.length; ++index) {
    if (nums4.includes(nums[index])) {
        posiciones.push(index);
    }
}

console.log(posiciones);

或者以“索引”开头1而不是0:

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = [];
for (let index = 0; index < nums.length; ++index) {
    if (nums4.includes(nums[index])) {
        posiciones.push(index + 1); // + 1 to make it 1-based
    }
}

console.log(posiciones);


或者如果您想使用所有FP,mapfilter

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = nums.map((value, index) => nums4.includes(value) ? index : null).filter(v => v !== null);

console.log(posiciones);

或者以“索引”开头1而不是0:

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344]
var nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344]
var posiciones = nums.map((value, index) => nums4.includes(value) ? index + 1 : null).filter(v => v !== null);
// + 1 to make it 1-based -----------------------------------------------^^^^

console.log(posiciones);

答案 1 :(得分:0)

如果在nums中找不到nums4元素,则您将获得-1。

var nums = [10, 3, 45, 44, 34, 4, 23, 44, 23, 254]
var nums4 = [44, 34, 4, 44, 254]
var posiciones = nums4.map(n => nums.indexOf(n));

console.log(posiciones);

答案 2 :(得分:0)

您可以使用Map并映射移位的索引。

var nums = [431, 324, 4344, 4324, 4344, 4324, 4444, 3441, 3214, 4344],
    nums4 = [324, 4344, 4324, 4344, 4324, 4444, 3214, 4344],
    pos = nums.reduce((m, v, i) => m.set(v, [...(m.get(v) || []), i + 1]), new Map);
    posiciones = nums4.map(v => pos.get(v).shift());

console.log(...posiciones);