Javascript/ES6:在JSON对象中按元素插入分组

Javascript/ES6:在JSON对象中按元素插入分组,javascript,ecmascript-6,vuetify.js,Javascript,Ecmascript 6,Vuetify.js,我从API接收一个JSON对象,比如: { "BuchungsvorgangKategorieId": 1, "BuchungsvorgangKategorie": "Miete", "Group": "Ideeller Bereich" }, { "BuchungsvorgangKategorieId": 2, "BuchungsvorgangKategorie": "Taiko-Beitrag", "Group

我从API接收一个JSON对象,比如:

       {
    "BuchungsvorgangKategorieId": 1,
    "BuchungsvorgangKategorie": "Miete",
    "Group": "Ideeller Bereich"
    },
      {
    "BuchungsvorgangKategorieId": 2,
    "BuchungsvorgangKategorie": "Taiko-Beitrag",
    "Group": "Ideeller Bereich"
    },
   {
    "BuchungsvorgangKategorieId": 5,
    "BuchungsvorgangKategorie": "Jahresbeitrag",
    "Group": "Ideeller Bereich"
},
      {
    "BuchungsvorgangKategorieId": 3,
    "BuchungsvorgangKategorie": "Reisekosten (Auftritt)",
    "Group": "Zweckbetrieb"
    },
      {
    "BuchungsvorgangKategorieId": 4,
    "BuchungsvorgangKategorie": "Auftritt",
    "Group": "Zweckbetrieb"
    },
现在,当使用Vuetify选择时,有一个按某个标题分组的选项。因此,我想将我的结果转化为:

    {header: "Ideller Bereich" },  
    {
    "BuchungsvorgangKategorieId": 1,
    "BuchungsvorgangKategorie": "Miete",
    "Group": "Ideeller Bereich"
    },
      {
    "BuchungsvorgangKategorieId": 2,
    "BuchungsvorgangKategorie": "Monatsbeitrag",
    "Group": "Ideeller Bereich"
    },
  {
    "BuchungsvorgangKategorieId": 5,
    "BuchungsvorgangKategorie": "Jahresbeitrag",
    "Group": "Ideeller Bereich"
  },
  {header: Zweckbetrieb },
      {
    "BuchungsvorgangKategorieId": 3,
    "BuchungsvorgangKategorie": "Reisekosten",
    "Group": "Zweckbetrieb"
    },
      {
    "BuchungsvorgangKategorieId": 4,
    "BuchungsvorgangKategorie": "Auftritt",
    "Group": "Zweckbetrieb"
    }
我想我应该在对象数组中循环(arr.map?),并有一个check变量,它最初是空的。始终如果组的当前值与检查变量不同,我需要更新检查变量,并在当前项目(arr.splice?)之前的位置插入新值

更新:

多亏@trincot和@Natixco的评论帮助我进一步调查,我才能够创建这段代码:

 let checkVariable = ""
this.FilterKategorien.forEach((item,index) => { //this.FilterKategorien contained the records from the API.
            if(item.Group!=checkVariable) {
              this.FilterKategorien.splice(index,0,{header: item.Group})
              checkVariable=item.Group
            }
          })
          console.log(this.FilterKategorien)

我只需要创建一个新数组;您始终可以将其分配回原始变量:

let grouped = data.reduce((acc, item, i) =>
    !i || acc[acc.length-1].Group !== item.Group 
        ? acc.concat({header: item.Group}, item)
        : acc.concat(item)
, []);
如果确实需要对原始数组进行变异,也可以使用上述方法,并将其拼接到原始数组中:

data.splice(0, data.length, ...data.reduce((acc, item, i) =>
    !i || acc[acc.length-1].Group !== item.Group 
        ? acc.concat({header: item.Group}, item)
        : acc.concat(item)
, []));

这不是有效的JSON。你可能说的是数组…?没错,但如果你不需要新的数组,我会使用foreach。好吧,你在最后一段中的假设是正确的。你试过了吗?是的,我现在试过了。。。感谢您向正确的方向推进:让checkVariable=”“this.FilterKategorien.forEach((项,索引)=>{if(项.BuchungsvorgangSteuerzuordnung!=checkVariable){this.FilterKategorien.splice(索引,0,{header:item.BuchungsvorgangSteuerzuordnung})checkVariable=item.BuchungsvorgangSteuerzuordnung})console.log(this.FilterKategorien),因此需要修改数组;没有创建一个新的吗?谢谢tincot。看到完全不同的方法很有趣。感谢您介绍我以前从未使用过的concat:-)我正在考虑关于这个片段的解决方案:!i | | acc[acc.length-1]。组!==项目组!我的意思是:如果没有,我就做点什么。为什么我需要这个?`在第一次迭代中,我等于0,对吗?所以它已经不同于未定义的…
!当
i
为0时,i
为false<代码>!i强制
i
为布尔值,因此它要么为false,要么为true。