찾기 및 지도에 관한 흥미로운 질문을 공유하세요.

찾기 및 지도에 관한 흥미로운 질문을 공유하세요.

찾기 및 매핑의 루프 순회 처리에 대한 흥미로운 질문을 공유하고, 문제 해결을 위해 맵을 사용할 때 코드 실행의 시간 복잡도를 최적화하는 것이 얼마나 도움이 되는지 이해하겠습니다.

필요

원본 배열을 다음 형식으로 변환합니다.

const arr = ["3-69", "3-87", "5-171", "5-65", "5-99"]

결과 배열을 다음 형식으로 변환합니다.

const arr = [
  {
    
    
    id: 3,
    children: ["69", "87"]
  },
  {
    
    
    id: 5,
    children: ["171", "65", "99"]
  }
]

해결책

두 가지 구체적인 솔루션이 있는데, 첫 번째는 축소 및 찾기 메서드를 사용하고 두 번째는 축소 및 매핑 메서드를 사용합니다.
첫 번째 방법은 좀 더 직접적인 아이디어를 가지고 있으며 개발 시 생각하기 쉬운 일반적인 방법이지만 중첩 루프를 사용하므로 시간 복잡도가 O(n^2)이고 상대적으로 긴 단점이 있습니다. 실행 시간.

const arr = ["3-69", "3-87", "5-171", "5-65", "5-99"]

const result1 = arr.reduce((prev, item) => {
    
    
  const [id, children] = item.split('-') //解构当前值
  let t = prev.find(item => item.id === id) //查找是否与原数组有匹配id
  // 存在匹配id,就推入到匹配id的 children 里面
  // 如果不存在匹配id,就推入当前项到下次 prev 数组里面
  // 需要注意,t的应用和 prev 里面匹配的项引用相同,可以直接赋值,并同步修改了 prev 里匹配项
  t ? t.children.push(children) : prev.push({
    
    id: id, children: [children]})
  return prev //返回处理好的 prev 数组
}, [])

console.log('result1 ==', result1)

두 번째 방법은 맵 데이터 구조에 대한 이해가 필요하며, 맵 데이터 구조의 자연스러운 장점으로 인해 키 값을 통한 빠른 검색과 키-값 구조를 가진 데이터 객체의 빠른 조작에 매우 적합합니다. 원본 배열에 해당하는 결과를 변환합니다. 배열(개질된 배열)은 맵 데이터 구조이고, 이후 객체 메소드와 맵 메소드를 통해 배열 구조의 결과 배열을 얻습니다. 1개의 순회 및 1개의 맵 메소드 연산이 사용됩니다. , 해당 시간 복잡도는 O(n + n), 즉 O(2n)이므로 실행 시간이 크게 최적화됩니다.

const map_data = arr.reduce((prev, item) => {
    
    
  const [id, children] = item.split('-') //解构当前值
  // 改造结果数组为 map 数据格式
  // 不匹配id,则将id作为 key, children 作为 value,一起存入 prev 对象
  // 如果匹配id,则将 children 推入到当前id下的 value 值里面
  if(prev[id]){
    
     prev[id].push(children) }
  else {
    
     prev[id] = [children] }
  return prev //返回处理好的 prev 对象
}, {
    
    })
// 通过对象下方法获取 map 数据结构的 key 值组成的数组
// 将该数组进行 map 方法执行,map 会创建一个新数组,将我们处理好的 map 数据结构的数据转换为数组形式
const result2 = Object.getOwnPropertyNames(map_data).map((v) => ({
    
    id: v, children: map_data[v]}))
console.log('result2 ==', result2)

실행 시간은 아래 실제 실행 시간 스크린샷을 보면 알 수 있는데, map 메소드가 코드 실행 속도를 크게 최적화한다는 것을 확실히 알 수 있습니다.
시간을 실행

Guess you like

Origin blog.csdn.net/qq_44886882/article/details/128722987