代码之家  ›  专栏  ›  技术社区  ›  bairog

从按属性筛选的对象数组字典中创建值数组

  •  0
  • bairog  · 技术社区  · 4 月前

    我有一个字典,其中key是字符串,value是对象数组:

    objDict = {
      dataset1: [ { id: 1, count: 6 }, { id: 2, count: 7 }, { id: 3, count: 8 } ],
      dataset2: [ { id: 1, count: 5 }, { id: 2, count: 4 }, { id: 3, count: 3 } ]
    }
    

    我需要用特定的过滤对象 id 并创建一个数组 count 值:for id = 2 这将是 countArray = [ 7, 4 ] . 我想我应该先用 Object.values(objDict) 但我不知道之后该怎么办。

    2 回复  |  直到 4 月前
        1
  •  1
  •   Ori Drori    4 月前

    将对象转换为数组 Object.values() ,展平为单个数组,减少并推送相关数组 count 累加器的值( acc )数组:

    const getCountById = (id, dict) => Object.values(objDict)
      .flat()
      .reduce((acc, { id: oid, count }) => {
        if(id === oid) acc.push(count)
      
        return acc
      }, [])
    
    
    const objDict = {
      dataset1: [ { id: 1, count: 6 }, { id: 2, count: 7 }, { id: 3, count: 8 } ],
      dataset2: [ { id: 1, count: 5 }, { id: 2, count: 4 }, { id: 3, count: 3 } ]
    }
    
    const result = getCountById(2, objDict)
    
    console.log(result)

    这有点滥用reduce,更习惯的形式是按 id ,然后将对象映射到 计数 值:

    const getCountById = (id, dict) => Object.values(objDict)
      .flat()
      .filter(o => o.id === id)
      .map(o => o.count)
    
    
    const objDict = {
      dataset1: [ { id: 1, count: 6 }, { id: 2, count: 7 }, { id: 3, count: 8 } ],
      dataset2: [ { id: 1, count: 5 }, { id: 2, count: 4 }, { id: 3, count: 3 } ]
    }
    
    const result = getCountById(2, objDict)
    
    console.log(result)
        2
  •  -1
  •   Harry Wright    4 月前

    因此,为了方便起见,您可以将 Object.values 使用reduce调用以获得所需结果

    类似于:

    const countArray = Object.values(objDict)
      .reduce((prev, curr) => {
        return [...prev, ...curr.filter(el => el.id === 2).map(el => el.count)]
      }, [])
    

    解释

    Object.values() 在这种情况下,将返回一个数组,因此您需要将其展开,我通过使用spread运算符返回 filter() map() 链。过滤器如其名称所示,用于过滤传递谓词函数的任何值,映射将返回您所需的正确格式。

    如果愿意,您还可以从reduce内部移动映射,以链接reduce的返回值。像这样:

    const countArray = Object.values(objDict)
      .reduce((prev, curr) => {
        return [...prev, ...curr.filter(el => el.id === 2)]
      }, [])
      .map(el => el.count)