【问题标题】:Splitting an array of objects by property按属性拆分对象数组
【发布时间】:2019-04-15 11:39:17
【问题描述】:

按属性分块对象数组的最佳方法是什么?

我希望对象的工作方式类似于没有默认值的 case 语句 - 它继续冒泡。

输入

[  
   {  
      "type":"Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Not Break"
   },
   {  
      "type":"Break"
   }
]

输出

[[{"type":"Break"}, {"type":"Not Break"}], [{"type":"Break"}, {"type":"Not Break"}] ...]

谢谢, 奥利

【问题讨论】:

  • 嗨!请使用tour(您将获得徽章!)并通读help center,尤其是How do I ask a good question? 您最好的选择是进行研究,search 以获取有关 SO 的相关主题,然后试一试. 如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您遇到的问题。人们会很乐意提供帮助。

标签: javascript arrays object properties


【解决方案1】:

不妨试试Objec.keys

myInputArray.forEach( myInputObject => {
  Object.keys(myInputObject).forEach( key => {
      if(key === 'type'){
          // Do magic
          // get the content by 
          myInputObject[key]
      }
      if(key === 'otherType'){
          // Do more magic
      }
  })
})

热烈的问候

【讨论】:

    【解决方案2】:

    您可以使用reduce() 分块并在Break 上推送一个新的子数组。这是在做一些假设(比如您的第一次将是 Break 类型),因此您需要弄清楚您的边缘情况,但它应该可以帮助您开始:

    let arr = [ { "type":"Break"},{  "type":"Not Break"},{  "type":"Break"},{  "type":"Not Break"},{  "type":"Break"},{  "type":"Not Break"},{  "type":"Not Break"},{  "type":"Not Break"},{  "type":"Not Break"},{  "type":"Not Break"},{  "type":"Break"}]
    
     let chunks = arr.reduce((arr, item) => {
        if (item.type == 'Break')  arr.push([])  // create a new child
        arr[arr.length-1].push(item)             // push into last child
        return arr
    }, [])
    console.log(chunks)

    【讨论】:

      【解决方案3】:

      如果我理解正确,您需要在每次 initial type 更改时对输入数据进行分块。如果这个假设是正确的,你可以这样做:

      var data = [{ "type": "Break" }, { "type": "Not Break" }, { "type": "Break" }, { "type": "Not Break" }, { "type": "Break" }, { "type": "Not Break" }, { "type": "Not Break" }, { "type": "Not Break" }, { "type": "Not Break" }, { "type": "Not Break" }, { "type": "Break" } ]
      
      const result = data.reduce((r,c) => {
        r.length && c.type != r[r.length-1][0].type ? r[r.length-1].push(c) : r.push([c])
        return r
      }, [])
      
      console.log(result)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 2022-12-04
        • 1970-01-01
        相关资源
        最近更新 更多