提问人:brad_fresh 提问时间:11/16/2022 最后编辑:brad_fresh 更新时间:11/17/2022 访问量:98
在一组重复项中找不到最长的出现时间
Can't find the longest occurancy in a set of duplicates
问:
目标是检测一组数组中的超字符串。在这种情况下,它应该是“bal”,但我得到的是“lbal”。
const arr = [
['g', 'l', 'o', 'b', 'a', 'l'],
['b','a','l','l']
]
const res = argv.reduce((acc, val) => acc.filter(elem => val.includes(elem)))
当我只需要最长的重复序列时,这个函数只给出所有重复项(在任何数组中显示的项目)。有什么建议吗?
答:
2赞
R4ncid
11/16/2022
#1
您可以创建一个对象来计算元素在数组数组中存在的次数
喜欢这个
const arr = [
['a', 'b', 'm'],
['g', 'o', 'a', 'b'],
['w', 'o', 'u', 'k', 'a', 'b']
]
const countTimes = data => data.flat().reduce((res, v) => {
return {
...res,
[v]: (res[v] || 0 ) + 1
}
}, {})
const duplicates = data => Object.entries(countTimes(data))
.filter(([v, n]) => n > 1)
.map(([v, n]) => v)
console.log(countTimes(arr))
console.log(duplicates(arr) )
评论
1赞
Wimanicesir
11/16/2022
这不是OP想要的吗?除非您将它与过滤器结合使用,否则您可以在其中检查大于 1 的内容。
1赞
Wimanicesir
11/16/2022
#2
const original = [
['a', 'b', 'm'],
['g', 'o', 'a', 'b'],
['w', 'o', 'u', 'k', 'a', 'b']
]
// The easiest is to split up between unique results and duplicates
let uniqueValues = []
let duplicates = []
// Now we're going to loop every array
original.forEach((arr) => {
// Loop every value inside the array
arr.forEach((value) => {
// Check if we had this value already
if (!uniqueValues.includes(value)) {
uniqueValues.push(value)
} else {
duplicates.push(value)
}
})
})
console.log('Duplicates: ', duplicates)
// If you want remove the duplicates from the duplicates, use set
let uniqueDuplicates = [...new Set(duplicates)]
console.log('Unique duplicates: ', uniqueDuplicates)
1赞
wjatek
11/16/2022
#3
如果你不必知道哪些数组重复,你可以使用 Array.prototype.flat() 来摆脱嵌套数组,然后检查简单数组是否有重复项。
const arr = [
['a', 'b', 'm'],
['g', 'o', 'a', 'b'],
['w', 'o', 'u', 'k', 'a', 'b']
]
const arr2 = arr.flat() // ['a', 'b', 'm', 'g', 'o', 'a', 'b', 'w', 'o', 'u', 'k', 'a', 'b']
const hasDuplicates = new Set(arr2).size !== arr2.length
1赞
aleEspinosaM
11/16/2022
#4
您可以创建一个计数,通过执行嵌套的 forEach 来查找全局复制的每个元素的数量
function findDuplicates(data) {
const map = {};
data.forEach((row) => {
row.forEach((item) => {
if (!map[item]) {
map[item] = 1;
} else [map[item]++];
});
});
return map;
}
1赞
gog
11/16/2022
#5
你可以创建一个简单的计数器对象(如果你知道python,这类似于):collections.Counter
class Counter extends Map {
update(values) {
for (let val of values)
this.set(val, 1 + (this.get(val) ?? 0))
}
}
ARR = [
['a', 'b', 'm'],
['g', 'o', 'a', 'b'],
['w', 'o', 'u', 'k', 'a', 'b']
]
const tally = new Counter()
for (let subArray of ARR)
tally.update(new Set(subArray))
for (let [element, count] of tally)
if (count === ARR.length)
console.log(element)
count === yourArrayOfArrays.length
选择出现在所有数组中的元素,您可以将其替换为查找任何重复项。count > 1
评论
1赞
Wimanicesir
11/16/2022
为什么“o”不是重复的?
1赞
gog
11/16/2022
@Wimanicesir:第一个数组中没有o
评论