【问题标题】:How to create a function that returns an index of the first repeated value in an array?如何创建一个返回数组中第一个重复值的索引的函数?
【发布时间】:2021-04-08 14:45:00
【问题描述】:

我的任务是:

  1. 要创建一个名为 indexOfRepeatedValue(arr) 的函数,
  2. 要在该函数中创建firstIndex 变量,
  3. 检查(使用for 循环)哪个数字(在给定数组中)作为第一个重复自身,
  4. 并将该数字的索引分配给先前创建的firstIndex 变量

给定的值数组是这样的,

const givenArr = [2, 4, 5, 2, 3, 5, 1, 2, 4];

因此,对于这个给定的数组,要重复的第一个数字是 2。那么 firstIndex 变量的值应该等于 0(在从该函数内部返回 firstIndex 变量的值之后)。

到目前为止,我的代码如下所示,

const givenArr = [2, 4, 5, 2, 3, 5, 1, 2, 4];

function indexOfRepeatedValue(arr) {
    let firstIndex;
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] === ) { //The place where I clearly miss something
            firstIndex = ;
        }
        break;
    }
    return firstIndex;
}

console.log(indexOfRepeatedValue(givenArr));

我不知道在if 语句中放什么。禁止使用indexOf 函数或类似的函数(尚未了解)。提前致谢!我渴望学习。

【问题讨论】:

  • 您需要以某种方式将值存储在循环中。否则你没有机会知道数组中是否出现过任何值

标签: javascript arrays loops for-loop


【解决方案1】:

您可以使用Set,如果循环遇到的元素已经存在于您找到匹配的集合中,您可以设置firstIndex 变量。

注意:如果数组没有重复项,firstIndexundefined

const givenArr = [2, 4, 5, 2, 3, 5, 1, 2, 4];

function indexOfRepeatedValue(arr) {
    let firstIndex;
    let s = new Set();
    for (let i = 0; i < arr.length; i++) {
        if (s.has(arr[i])) { 
            firstIndex = arr.indexOf(arr[i]);
            break;
        }else {
          s.add(arr[i])
        }
    }
    return firstIndex;
}

console.log(indexOfRepeatedValue(givenArr));

基于 OP 的评论

如果您不想拥有额外的数据结构,您可以检查 您当前所在的元素已经存在。但如果可能,请尝试使用第一种方法。

const givenArr = [2, 4, 5, 2, 3, 5, 1, 2, 4];

function indexOfRepeatedValue(arr) {
    let firstIndex;
    for (let i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) < i) { 
            firstIndex = arr.indexOf(arr[i]);
            break;
        }
    }
    return firstIndex;
}

console.log(indexOfRepeatedValue(givenArr));

【讨论】:

  • 没有set 功能是否可以解决这个问题? :)
  • 是的!您可以使用任何可以判断该项目是否已在循环中遇到的数据结构。但是Set 是最好的选择。
  • 我添加了另一个没有Set 的解决方案,看看。 @szachy113
  • 那更接近了,朋友。但它使用了indexOf 函数。我想知道您是否可以在没有它的情况下解决它(正如我在主题中指定的那样)。
  • 我认为这不可能。你需要知道你当前所在的元素是否已经被遍历过。
【解决方案2】:

您可以使用一个对象来存储第一个找到的索引并检查该对象是否包含数组的值。如果找到返回索引。

function indexOfRepeatedValue(array) {
    const indices = {};
    for (let i = 0; i < array.length; i++) {
        const value = array[i];
        if (value in indices) return indices[value];
        indices[value] = i;
    }
    return -1; // or any other value if not found
}

console.log(indexOfRepeatedValue([7, 13, 2, 4, 5, 2, 3, 5, 1, 2, 4]));

【讨论】:

  • 是否可以在不使用对象类型的情况下解决这个问题? :)
  • 有趣的是,您接受了indexOf 和更复杂的数据类型Set 的答案。
  • 你必须仔细阅读 cmets,Nina :) 但是,我仍然是堆栈溢出的新手,还在学习如何管理问题。
  • 我想你的回答也有道理,但代码对我个人来说并不是那么清晰。
  • 没有隐藏任何东西。对象是最重要的javascript类型。所有其他类型都有其起源。
【解决方案3】:

简洁

const findRepeatedIndex = a => [...a].findIndex(function(x) {
  return (l = this.l = this.l || {}) && l[x] && 1 || (l[x] = 1) && 0;
});
console.log(findRepeatedIndex([2, 4, 5, 2, 3, 5, 1, 2, 4]));
  • spread 语法用于跳过数组突变
  • findIndex 找到第一个真实评估的索引,如果没有找到则为 -1
  • function 启用 this 上下文,箭头语法不会
  • this 允许将 l 添加到数组中以进行跟踪
  • 如果l[x]1,则return 是真实的
  • else (l[x] = 1) &amp;&amp; 0 将赋值与 falsy 结合起来

【讨论】:

  • 为什么this ...?
猜你喜欢
  • 2018-04-06
  • 1970-01-01
  • 2018-03-27
  • 2012-09-26
  • 1970-01-01
  • 2016-05-21
  • 2014-02-18
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多