如何使用for循环将正确数量的重复项连接成字符串?

问题描述 投票:0回答:3

我有一个包含重复对象的数组,比方说:[A,A,B,C]。通过for循环,我将重复项的名称合并为一个字符串。我试过了:

for (var i = 0; i < myArray.data.length - 1; i ++) {
  for (var j = i + 1; j < myArray.data.length; j ++) {
    if (myArray.data[i].id == myArray.data[j].id) {
      identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
    }
  }
}

此打印:“ A,A”,这是正确的。但是,如果数组为[A,A,A,B,C],则打印不正确的“ A,A,A,A,A,A”,只有3个重复项而不是6个。字符串,因为在某些情况下,不同的对象(具有不同的ID)作为重复返回,并且我需要知道它们的名称才能知道它们到底是哪个。

我想到的一种解决方案是将名称存储在数组中,如果相同名称的数量大于2,则将其他名称的数量减半,然后转换为字符串。还有什么更简单有效的方法吗?

javascript loops duplicates
3个回答
0
投票

但是,如果数组是[A,A,A,B,C],它将打印“ A,A,A,A,A,A”]

这是因为当i = 0且j = 1时,您将获得一个匹配项,并且sameObjects设置为“ A,A”。当i = 0和j = 2时,您将获得另一个匹配项,并将sameObjects设置为其先前值加上“ A,A”。然后,当i = 1和j = 2时,您将获得另一个匹配并执行相同的串联。

为什么不使用Map对象并将该对象用作键,其值为计数?


0
投票

这可能不是实现此目的的最直接方法,但我认为它应该可以完成工作。

var uniqueLetters = myArray.filter(distinct);

for(var i = 0; i < uniqueLetters.length; i++){
    for(var j = 0; j < myArray.Length; j++){

        if(myArray.data[j] == uniqueLetters[i]){
            identicalObjects = identicalObjects + myArray.data[i].name + ", " + myArray.data[j].name;
        }
    }
}

例如,假设您有一个数组[A,A,B,C]。 uniqueLetters将包含[A,B,C]。然后遍历原始数组,请检查不同的数组。

再次,这可能不是处理此问题的最直接方法,但它应该可以工作。


0
投票

如果将对象数组转换为List,则将更加轻松,灵活。列表功能更强大,您可以使用列表做更多的事情。

在您的示例中,您尝试根据ID查找重复项。使用列表,可以用单句实现。

Map<Integer, List<YourObject>> yourObjectMap = empArray.stream().collect(Collectors.groupingBy(YourObject::getId));

© www.soinside.com 2019 - 2024. All rights reserved.