我必须在数组中找到第一个重复值,然后在变量firstIndex中返回其索引。这必须通过for循环来完成,它应该在找到第一个重复之后停止。我知道这可能很简单,但我卡住了。到目前为止,我有这个,但它似乎没有工作:
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
for (var a = 0; a < numbers4.length; a++) {
for (var b = a+1; b < numbers4.length; b++) {
if (numbers4[a] === numbers4[b])
firstIndex = numbers4.indexOf(numbers4[a]);
break;
}
}
console.log(firstIndex);
控制台打印出1,这很好,因为2是第一次复制,但是当我更改数组中的数字时,循环不起作用。你能告诉我这里可以改变什么吗?
提前致谢!
答案 0 :(得分:2)
使用以下
更改您的代码 var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
var isMatch=false;
for (var a = 0; a < numbers4.length; a++) {
for (var b = a+1; b < numbers4.length; b++) {
if (numbers4[a] === numbers4[b]){
firstIndex = numbers4.indexOf(numbers4[a]);
isMatch=true;
break;
}
}
if (isMatch) {break;}
}
console.log(firstIndex);
答案 1 :(得分:2)
如果我正确理解你的问题,那可以帮到你...... 基本上,您需要进行双重迭代。
const firstDupeIndex = list => list.findIndex(
(item, index) => list.lastIndexOf(item) !== index
);
console.log(
"First Dupe at index:",
firstDupeIndex([5, 2, 3, 4, 4, 6, 7, 1, 2, 3])
);
&#13;
答案 2 :(得分:1)
我会使用一个记住已经找到的值的对象......这样的东西应该有效;)
var numbers4 = [5, 2, 3, 4, 4, 6, 7, 1, 2, 3];
function findFirstDuplicateIndex(arr){
var found = {};
for (var a = 0, aa = arr.length; a < aa ; a++) {
if (found[arr[a]])
return found[arr[a]];
found[numbers4[a]] = a
}
}
console.log(findFirstDuplicateIndex(numbers4));
&#13;
它非常快,因为你只是循环一次通过数组。其余的时间你只是访问一个对象属性或你设置了对象属性...如果你有问题请告诉我;)
但也许有更快的东西......这只是一个想法^^
PS:它也适用于单词,而不仅仅是数字
答案 3 :(得分:0)
你甚至不需要嵌套for循环。
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
for (var a = 1; a < numbers4.length; a++) { //start from second elem since first is never a duplicate
if (numbers4.lastIndexOf(numbers4[a])> a) {
firstIndex = a;
break;
}
}
console.log(firstIndex); //1
&#13;
迭代期间你要做的就是检查当前值是否存在于数组中的某个位置。这是通过使用lastIndexOf()
检查此值的最后一个索引来完成的。
答案 4 :(得分:0)
你的问题是 - 你有两个循环,只有一个break
,你需要突破两者。
为什么不在值匹配时立即返回索引?
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
function getDuplicate(numbers4)
{
for (var a = 0; a < numbers4.length; a++) {
for (var b = a+1; b < numbers4.length; b++) {
if (numbers4[a] === numbers4[b]){
return a;
}
}
}
}
console.log(getDuplicate(numbers4 ));
但是,您可以通过保留地图来进一步优化代码
function getDuplicate( numbers )
{
var map = {};
for (var a = 0; a < numbers.length; a++)
{
if( map[ numbers[ a ] ] )
{
return a;
}
map[ numbers[ a ] ] = true;
}
return -1;
}
答案 5 :(得分:0)
您可以检查org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: Error looking for paramter names in bytecode: unexpected bytes in file
at org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:441)
at org.apache.axis2.deployment.repository.util.ArchiveReader.buildServiceGroup(ArchiveReader.java:109)
at org.apache.axis2.deployment.repository.util.ArchiveReader.processServiceGroup(ArchiveReader.java:232)
at org.apache.axis2.deployment.ServiceDeployer.deploy(ServiceDeployer.java:154)
是否不等于indexOf()
并返回值和中断循环
lastIndexOf()
答案 6 :(得分:0)
你的休息;终止b循环,因为if()不使用括号{}。
此外,firstIndex应简单地设置为a或b,具体取决于您是否需要返回重复的首次出现或首次重复。
应该是:
if (numbers4[a] === numbers4[b])
{
firstIndex = a;
break;
}
答案 7 :(得分:0)
var numbers = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex;
var len = numbers.length;
for (var i = 0; i < len; i++) {
var tmpArray = numbers.slice(i + 1, len);
var index = tmpArray.indexOf(numbers[i]);
if (index !== -1) {
firstIndex = index + i + 1;
break;
}
}
console.log(firstIndex);
&#13;
<强>更新强>
实际上你的逻辑是正确的,但你错过了if condition
的大括号,如果条件满足那么它意味着firstIndex
与a
相同
这是带括号的代码,
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
for (var a = 0; a < numbers4.length; a++) {
for (var b = a + 1; b < numbers4.length; b++) {
if (numbers4[a] === numbers4[b]) {
firstIndex = a
break;
}
}
}
console.log(firstIndex);
&#13;
答案 8 :(得分:0)
问题表明阵列中的第一个欺骗必须与它的索引一起找到。所以我返回一个对象,其中i
属性是 i ndex,e
属性是第一个重复的 e 属性。执行此任务的一种方法是
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3],
headDupe = (a,r={}) => (r.e = a.find((n,i) => (r.i = a.indexOf(n), r.i < i)),r);
console.log(headDupe(numbers4));