我需要找到前两个数字,并显示如下索引:
var arrWithNumbers = [2,5,5,2,3,5,1,2,4];
所以第一个重复的数字是2
所以变量firstIndex
应该有值0.我必须使用for循环。
var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
var firstIndex
for (i = numbers[0]; i <= numbers.length; i++) {
firstIndex = numbers[0]
if (numbers[i] == firstIndex) {
console.log(firstIndex);
break;
}
}
您可以将Array#indexOf
方法与fromIndex
参数一起使用。
var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
// iterate upto the element just before the last
for (var i = 0; i < numbers.length - 1; i++) {
// check the index of next element
if (numbers.indexOf(numbers[i], i + 1) > -1) {
// if element present log data and break the loop
console.log("index:", i, "value: ", numbers[i]);
break;
}
}
var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11],
ref = {};
// iterate over the array
for (var i = 0; i < numbers.length; i++) {
// check value already defined or not
if (numbers[i] in ref) {
// if defined then log data and brek loop
console.log("index:", ref[numbers[i]], "value: ", numbers[i]);
break;
}
// define the reference of the index
ref[numbers[i]] = i;
}
您可以使用两个for
循环检查每个值对每个值。如果找到重复值,则迭代停止。
该提议使用labeled statement来打破外环。
var numbers = [1, 3, 6, 7, 5, 7, 6, 6, 4, 9, 10, 2, 11],
i, j;
outer: for (i = 0; i < numbers.length - 1; i++) {
for (j = i + 1; j < numbers.length; j++) {
if (numbers[i] === numbers[j]) {
console.log('found', numbers[i], 'at index', i, 'and', j);
break outer;
}
}
}
移动每个项目并查找是否在不同的索引上找到相同的项目,如果是,则重复并将其保存到复制变量和中断循环
var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
var duplicate = null;
for (var i = 0; i < numbers.length; i++) {
if (numbers.indexOf(numbers[i]) !== i) {
duplicate = numbers[i];
break; // stop cycle
}
}
console.log(duplicate);
var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
var map = {};
for (var i = 0; i < numbers.length; i++) {
if (map[numbers[i]] !== undefined) {
console.log(map[numbers[i]]);
break;
} else {
map[numbers[i]] = i;
}
}
好的,让我们打破这个。我们在这里做的是为它们首次出现的索引创建一个数字映射。因此,当我们遍历数字数组时,我们检查它是否在我们的数字地图中。如果它是我们找到它并在我们的地图中返回该键的值。否则,我们将数字添加为地图中的一个键,该键指向它首次出现的索引。我们使用map的原因是它非常快O(1)所以我们的整体运行时间是O(n),这是你在未排序的数组上执行此操作的最快速度。
作为替代方案,你可以使用indexOf
和lastIndexOf
,如果值不同,有多次重复,你可以打破循环;
function getFirstDuplicate(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i]))
return arr[i];
}
}
var arrWithNumbers = [2, 5, 5, 2, 3, 5, 1, 2, 4];
console.log(getFirstDuplicate(arrWithNumbers))
var numbers = [1, 3, 6, 7, 5, 7, 6, 6, 4, 9, 10, 2, 11]
console.log(getFirstDuplicate(numbers))
许多好的答案..人们也可以在功能和效率方面做到这一点,如下所示;
var arr = [2,5,5,2,3,5,1,2,4],
frei = arr.findIndex((e,i,a) => a.slice(i+1).some(n => e === n)); // first repeating element index
console.log(frei)
如果结果有效,因为.findIndex()
和.some()
函数都会在满足条件时终止。
我有同样的任务,并提出了这个非常基本的解决方案:
var arr = [7,4,2,4,5,1,6,8,9,4];
var firstIndex = 0;
for(var i = 0; i < arr.length; i++){
for( var j = i+1; j < arr.length; j++){
if(arr[i] == arr[j]){
firstIndex = arr[i];
break;
}
}
}
console.log(firstIndex);
第一个for循环从数组(第7个)获取第一个元素,然后另一个for循环检查所有其他元素,依此类推。
这里重要的是将第二个循环中的j定义为i + 1,否则,任何元素都会在相同的索引处找到相等的数字,而firstIndex将在完成所有循环后得到最后一个的值。
var addIndex = [7, 5, 2, 3, 4, 5, 7,6, 2];
var firstmatch = [];
for (var i = 0; i < addIndex.length; i++) {
if ($.inArray(addIndex[i], firstmatch) > -1) {
return false;
}
firstmatch.push(addIndex[i]);
}