我想在数组中找到重复值的索引。
例如
输入:
$data = @(1, 2, 3, 2, 1)
输出:
$indexes = @(3, 4)
答案 0 :(得分:1)
对于另一种方法,可以将try-catch
块与哈希表一起使用。
$data = @(1, 2, 3, 2, 1)
$hash = @{}
$indexes = for ($i = 0; $i -lt $data.count; $i++ ) {
try {
$hash.add($data[$i],$i)
}
catch {
$i
continue
}
}
# Output
$indexes
3
4
这里的想法是将每个值作为键,并将相应的索引作为值添加到哈希表。由于[hashtable]
对象只能具有唯一键,因此将引发并捕获异常。在catch块中,我们只输出最终存储在$indexes
中的索引。 continue
语句允许循环递增并保持处理。
从算法上讲,该解决方案与已经提出的解决方案几乎相同。但是,它使用Add()
的更有效的[arraylist]
方法,而不是在每次迭代期间重建(+=
)[array]
。在此示例中,性能可以忽略不计,但在较大的数据集中可能值得考虑。这也选择了传统的for
循环,而不是foreach
。
$uniqueValues = [collections.arraylist]@()
$indexes = for ($i = 0; $i -lt $data.count; $i++) {
if ($uniqueValues -contains $data[$i]) {
$i
}
else {
[void]$uniqueValues.Add($data[$i])
}
}
# Output
$indexes
3
4
此解决方案维护[arraylist]
个唯一值($uniqueValues
)。任何非唯一值,其索引($i
)都会输出并存储在$indexes
中。唯一性是通过使用-contains
运算符将$data
迭代中的当前值与$uniqueValues
中已经存在的值进行比较来确定的。
答案 1 :(得分:1)
您还可以为此使用哈希表:
3
4
结果:
users = [{ name: "user1", role: ["admin", "tester", "viewer"], },{ name: "user2", role: ["admin", "tester", "viewer"], } ] userRole = users.map(user => { roles = user.role.map(x => { return {role:x,user:user.name} }) return { name: user.name, role: roles } }) console.log(userRole)
答案 2 :(得分:0)
内部有if
的Foreach循环应该可以完成这项工作:
$data = @(1, 2, 3, 2, 1)
$uniqueValues = @()
$duplicatesIndexes = @()
$data | ForEach-Object {$counter = 0}{
if ($_ -notin $uniqueValues) {
$uniqueValues += $_
} else {
$duplicatesIndexes += $counter
}
$counter++
}
# Output
PS> $duplicatesIndexes
3
4