在一组重复项中找不到最长的出现时间

Can't find the longest occurancy in a set of duplicates

提问人:brad_fresh 提问时间:11/16/2022 最后编辑:brad_fresh 更新时间:11/17/2022 访问量:98

问:

目标是检测一组数组中的超字符串。在这种情况下,它应该是“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)))

当我只需要最长的重复序列时,这个函数只给出所有重复项(在任何数组中显示的项目)。有什么建议吗?

javascript 序列 reduce indexof

评论

1赞 aleEspinosaM 11/16/2022
是否要查找全局重复项 Global?还是每行?
0赞 brad_fresh 11/17/2022
@aleEspinosaM全球。一个或一个序列(当它发生时)。
1赞 Wimanicesir 11/17/2022
我投票结束这个问题,因为这个人一直在编辑他的问题,以提出与他最初不同的事情。
0赞 brad_fresh 11/18/2022
@Wimanicesir 我完全同意。感谢您的帮助。

答:

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