需要在JavaScript中格式化数组的帮助吗

需要在JavaScript中格式化数组的帮助吗,javascript,dictionary,Javascript,Dictionary,我有一个JavaScript数组,格式如下: [ { “标题”:正确, “id”:“0”, “名称”:“乳制品”, }, { “类别”:“乳制品”, “标题”:false, “id”:“-LSlje6ESGALGpckMhb7”, “名称”:“牛奶”, }, { “类别”:“乳制品”, “标题”:false, “id”:“-LSM9EPFG5DHW036规则”, “名称”:“奶酪”, }, { “标题”:正确, “id”:“3”, “名称”:“甜点”, }, { “类别”:“甜点”, “标题”:

我有一个JavaScript数组,格式如下:

[
{
“标题”:正确,
“id”:“0”,
“名称”:“乳制品”,
},
{
“类别”:“乳制品”,
“标题”:false,
“id”:“-LSlje6ESGALGpckMhb7”,
“名称”:“牛奶”,
},
{
“类别”:“乳制品”,
“标题”:false,
“id”:“-LSM9EPFG5DHW036规则”,
“名称”:“奶酪”,
},
{
“标题”:正确,
“id”:“3”,
“名称”:“甜点”,
},
{
“类别”:“甜点”,
“标题”:false,
“id”:“-LSm9MLZkrnvtPySw5U6”,
“名字”:“蛋糕”,
},
{
“类别”:“甜点”,
“标题”:false,
“id”:“-LSmAQ0rdDLrpz0TSPuD”,
“名称”:“馅饼”,
},
{
“标题”:正确,
“id”:“6”,
“名称”:“水果”,
},
{
“类别”:“水果”,
“标题”:false,
“id”:“-LSlazVIGAKLakxAIa8G”,
“名称”:“苹果”,
},
{
“类别”:“水果”,
“标题”:false,
“id”:“-LSlb5GH6xZz-DpNVS22”,
“名称”:“梨”,
},
{
“类别”:“水果”,
“标题”:false,
“id”:“-LSwWJldY1nxQrotyv-V”,
“名称”:“草莓”,
},
{
“标题”:正确,
“id”:“10”,
“名称”:“肉”,
},
{
“类别”:“肉类”,
“标题”:false,
“id”:“-LSljXQzfXthJbOA54Ah”,
“名字”:“鱼”,
},
{
“类别”:“肉类”,
“标题”:false,
“id”:“-LSmA2-R9pOY8abAUyST”,
“姓名”:“牛排”,
},
{
“类别”:“肉类”,
“标题”:false,
“id”:“-LSmAJ4J4gIfVQ8sgPDa”,
“名称”:“猪肉”,
},
]
我要做的是映射此数组,并将其转换为以下格式:

[
{
标题:文件名称,
数据:items.slice(indexOfFirstHeader、indexOfSecondHeader),
},
{
标题:副总裁姓名,
数据:items.slice(indexOfSecondHeader,indexOfThirdHeader),
},
{
标题:第三个标题的名称,
数据:items.slice(indexOfThirdHeader,indexofourthheader),
},…等等
]
因此,对于原始数组中的每个“头”,基本上都有一个对象部分。每个对象节数据属性将包含在第一个标头和第二个标头之间找到的项,依此类推,直到不再有标头为止。我真的不知道该怎么做。以下是我正在使用的模块的参考:


谢谢

我想你可以做一些类似的事情

const data = [];
let activeIndexForData = -1;

for(let i = 0; i < dataToSort.length -1; i++) {
   if(dataToSort[i].header) {
       activeIndexForData++;
   }

   if(data.length < activeIndexForData - 1) {
       data.push({ title: dataToSort[i].name, data@ []})
   }
   else {
      data[activeIndexForData].data.push({ title: dataToSort[i].name, data: [])
   }
}
const data=[];
让activeIndexForData=-1;
for(设i=0;i
我想这可能就是你想要实现的目标

var grouped = items.reduce((acc,obj)=>{
   let {header, name} = obj;

   if (header) return [...acc, { title:name, data:[] }] // either first matching header or new match. Add fresh 'header' object
   if (!acc.length) return acc;        //not header and none have passed. Do nothing

   let allButLast = acc.slice(0, acc.length-1),
       lastElem = acc[acc.length-1];  // not a header, but there is an existing match. Add it to last match's data array

   return [
      ...allButLast, 
      {
         ...lastElem, 
         data:[...lastElem.data, obj]
      }
  ]
},[])
但是,出于此目的,信任数组的顺序似乎不可靠。通过
isHeader.name===notHeader.category
进行匹配可能更可靠,从而减少对迭代数据顺序的推测。像这样

var grouped = items.reduce((acc,obj)=>{
   let {header, name, category} = obj;

   if (header) return [...acc, { title:name, data:[] }];
   if (!acc.length) return acc;        

   return acc.map((elem)=>{
      if (elem.title !== category) return elem; 
      return {
        ...elem,
        data: [ ...elem.data, obj]
      };
   })
},[])

@Craig投票完全是自由裁量的。没有试图解决自己的问题是一个完全有效的案例,正如这里所期望的那样,因为这是一个清晰而简洁的问题陈述。无法解释反对票——这取决于社区成员如何评价这个问题——然而,我有点搞不清楚这是什么意思“Namoffirtheader”和
。我认为更值得演示给定样本数据的数据应该是什么样子。解释令人困惑,因为即使使用“header”"引用,似乎无法解释它与@vol7ron的混淆程度。我的理解是,有一个数据数组应该嵌套,而不是嵌套。如果header为true,则该数组应该是顶级项,数组中直接后面的所有内容都应该是该项的子项,除非下一项的header设置为true也是,在这种情况下,它也是一个顶级项目。因此将平面结构转换为嵌套结构。@Craig更有意义的是,我没有投入足够的时间试图理解。出于某种原因,我认为他正在使用
true
false
作为标题。措辞和示例可以改进,以便读者在理解方面做的工作越来越少,而在帮助方面做的工作越来越多。我仍然建议他在给出示例和格式的情况下列出预期的案例。非常感谢你能够理解我措辞拙劣的问题lol。这正是我所需要的。我仍然不能完全理解你是如何解决这个问题的。没问题,我想你的pseudo代码实际上非常清晰,尽管您添加的解释提供了额外的清晰性。