Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何分离每个JSON对象并将它们分组到JavaScript中的数组中?_Javascript_Node.js_Arrays - Fatal编程技术网

如何分离每个JSON对象并将它们分组到JavaScript中的数组中?

如何分离每个JSON对象并将它们分组到JavaScript中的数组中?,javascript,node.js,arrays,Javascript,Node.js,Arrays,multer.js中的req.file示例 [ { fieldname: files0, originalname: 'Screenshot from 2020-05-23 01-52-30.png', encoding: '7bit', mimetype: 'image/png', destination: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-4

multer.js中的req.file示例

[
    {
        fieldname: files0,
        originalname: 'Screenshot from 2020-05-23 01-52-30.png',
        encoding: '7bit',
        mimetype: 'image/png',
        destination: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133',
        filename: '1606822252923_Screenshot from 2020-05-23 01-52-30.png',
        path: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133/1606822252923_Screenshot from 2020-05-23 01-52-30.png',
        size: 172092
      },
      {
        fieldname: files0,
        originalname: 'Screenshot from 2020-05-22 08-44-05.png',
        encoding: '7bit',
        mimetype: 'image/png',
        destination: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133',
        filename: '1606822252925_Screenshot from 2020-05-22 08-44-05.png',
        path: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133/1606822252925_Screenshot from 2020-05-22 08-44-05.png',
        size: 440592
      },
      {
        fieldname: files1,
        originalname: 'Screenshot from 2020-05-30 11-36-42.png',
        encoding: '7bit',
        mimetype: 'image/png',
        destination: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133',
        filename: '1606822252930_Screenshot from 2020-05-30 11-36-42.png',
        path: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133/1606822252930_Screenshot from 2020-05-30 11-36-42.png',
        size: 477511
      },
      {
        fieldname: files1,
        originalname: 'Screenshot from 2020-05-30 11-36-36.png',
        encoding: '7bit',
        mimetype: 'image/png',
        destination: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133',
        filename: '1606822252931_Screenshot from 2020-05-30 11-36-36.png',
        path: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133/1606822252931_Screenshot from 2020-05-30 11-36-36.png',
        size: 223362
      },
      {
        fieldname: files1,
        originalname: 'Screenshot from 2020-05-30 11-36-31.png',
        encoding: '7bit',
        mimetype: 'image/png',
        destination: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133',
        filename: '1606822252932_Screenshot from 2020-05-30 11-36-31.png',
        path: 'public/uploads/projects/0a480789-eb14-4fe4-bb89-44aa741efe33/proposals/chma00000133/1606822252932_Screenshot from 2020-05-30 11-36-31.png',
        size: 260419
      }
]
我想用每个JSON对象的fieldname动态地对它们进行分组,并将它们存储在一个对象数组中,同时使用它们的fieldname编号作为数组索引

根据用户输入,组可以介于0到9之间

我希望的结果是

someArr = [

    [
        {
            fieldname: files0
            originalname: somevalue,
            ...
            size: some value
        },
        {
            fieldname: files0,
            originalname: somevalue,
            ...
            size: some value
        },
    ]
        ,
    [
        
        {
            fieldname: files1,
            originalname: somevalue,
            ...
            size: some value
        },
        {
            fieldname: files1,
            originalname: somevalue,
            ...
            size: some value
        },
        {
            fieldname: files1,
            originalname: somevalue,
            ...
            size: some value
        },
    ]
    ...
    
]
如果它存在,一些arr[9]会返回

[

    {
        fieldname: files9,
        originalname: somevalue,
        ...
        size: some value
    },
    {
        fieldname: files9,
        originalname: somevalue,
        ...
        size: some value
    },
]
我尝试的是首先解析字段名中的整数,并将它们重新指定为值,以便更好地使用for循环进行排序

Object.keys(req.files).forEach((key) => {
  const thisFile = req.files[key];
  const thisFileGroup = parseInt(thisFile.fieldname.match(/\d/g).join(''), 10); 
  // rename fieldname from files0, files1 ... to 0 , 1 ....
  req.files[key].fieldname = thisFileGroup;
});

但是从这里,我找不到将此元素thisfile推送到何处,因为我无法在更高的作用域中预先声明每个数组,因为它们也需要动态创建。

如果您不需要按索引文件排序[index]

在这种情况下,你可以反对。 您的对象将按fieldname属性分组,而不是按字母顺序分组,尽管它包含一个数组,其中的项具有相同的属性键。 如果需要,使用和迭代对象

常数数据=[ {fieldname:files0,原始名称:'0-a'}, {fieldname:files0,原始名称:'0-b'}, {fieldname:files1,原始名称:'1-a'}, {fieldname:files1,原始名称:'1-b'}, {fieldname:files1,原始名称:'1-c'}, ]; const byFieldName=data.reduceob,d=>{ 如果!ob.hasOwnPropertyd.fieldname ob[d.fieldname]=[]; ob[d.fieldname].pushd; 返回ob; }, {}; //console.logbyFieldName;//取消注释以查看其外观
console.log Object.valuesbyFieldName 如果您不需要按索引文件订购[index]

在这种情况下,你可以反对。 您的对象将按fieldname属性分组,而不是按字母顺序分组,尽管它包含一个数组,其中的项具有相同的属性键。 如果需要,使用和迭代对象

常数数据=[ {fieldname:files0,原始名称:'0-a'}, {fieldname:files0,原始名称:'0-b'}, {fieldname:files1,原始名称:'1-a'}, {fieldname:files1,原始名称:'1-b'}, {fieldname:files1,原始名称:'1-c'}, ]; const byFieldName=data.reduceob,d=>{ 如果!ob.hasOwnPropertyd.fieldname ob[d.fieldname]=[]; ob[d.fieldname].pushd; 返回ob; }, {}; //console.logbyFieldName;//取消注释以查看其外观 console.log Object.valuesbyFieldName 我会用

常量数据=[ {fieldname:'files0',originalname:'Screenshot from 2020-05-23 01-52-30.png',}, {fieldname:'files0',originalname:'Screenshot from 2020-05-22 08-44-05.png',}, {fieldname:'files1',originalname:'Screenshot from 2020-05-30 11-36-42.png',}, {fieldname:'files1',originalname:'Screenshot from 2020-05-30 11-36-36.png',}, {fieldname:'files1',originalname:'Screenshot from 2020-05-30 11-36-31.png',}], arr=data.reduceac,cur=>{ const idx=cur.fieldname.replacefiles;//获取0,1 if acc[idx]acc[idx].pushcur;//如果已经存在,只需按下 else acc[idx]=[cur];//否则初始化 返回acc; },[] console.logarr我会使用

常量数据=[ {fieldname:'files0',originalname:'Screenshot from 2020-05-23 01-52-30.png',}, {fieldname:'files0',originalname:'Screenshot from 2020-05-22 08-44-05.png',}, {fieldname:'files1',originalname:'Screenshot from 2020-05-30 11-36-42.png',}, {fieldname:'files1',originalname:'Screenshot from 2020-05-30 11-36-36.png',}, {fieldname:'files1',originalname:'Screenshot from 2020-05-30 11-36-31.png',}], arr=data.reduceac,cur=>{ const idx=cur.fieldname.replacefiles;//获取0,1 if acc[idx]acc[idx].pushcur;//如果已经存在,只需按下 else acc[idx]=[cur];//否则初始化 返回acc; },[]
console.logarr我尽量不修改您的逻辑来实现这一点。 如果没有files2,filesArray[2]将是未定义的

//省略其他字段 常数要求={ 档案:[ {fieldname:files0,originalname:'来自2020-05-23 01-52-30.png的屏幕截图', {fieldname:files0,originalname:'2020-05-22 08-44-05.png'截图, {fieldname:files1,originalname:'来自2020-05-30 11-36-42.png的截图', {fieldname:files1,originalname:'来自2020-05-30 11-36-36.png的屏幕截图', {fieldname:files1,originalname:'来自2020-05-30 11-36-31.png的屏幕截图', {fieldname:files3,originalname:'来自2020-05-30 11-36-42.png的屏幕截图', {fieldname:files3,originalname:'来自2020-05-30 11-36-36.png的屏幕截图', {fieldname:files3,originalname:'2020-05-30 11-36-31.png截图} ] } 让filesArray=[] 对于req.files的let文件{ const thisFileGroup=parseIntfile.fieldname.match/\d/g.join,10; if!filesArray[此文件组]{ FileArray[thisFileGroup]=[] } FileArray[thisFileGroup].pushfile } console.logfilesArray[2]//将是未定义的 console.logfilesArray[1]//将是files1数组 console.logfilesArray我尽量不 修改你的逻辑来做到这一点。 如果没有files2,filesArray[2]将是未定义的

//省略其他字段 常数要求={ 档案:[ {fieldname:files0,originalname:'来自2020-05-23 01-52-30.png的屏幕截图', {fieldname:files0,originalname:'2020-05-22 08-44-05.png'截图, {fieldname:files1,originalname:'来自2020-05-30 11-36-42.png的截图', {fieldname:files1,originalname:'来自2020-05-30 11-36-36.png的屏幕截图', {fieldname:files1,originalname:'来自2020-05-30 11-36-31.png的屏幕截图', {fieldname:files3,originalname:'来自2020-05-30 11-36-42.png的屏幕截图', {fieldname:files3,originalname:'来自2020-05-30 11-36-36.png的屏幕截图', {fieldname:files3,originalname:'2020-05-30 11-36-31.png截图} ] } 让filesArray=[] 对于req.files的let文件{ const thisFileGroup=parseIntfile.fieldname.match/\d/g.join,10; if!filesArray[此文件组]{ FileArray[thisFileGroup]=[] } FileArray[thisFileGroup].pushfile } console.logfilesArray[2]//将是未定义的 console.logfilesArray[1]//将是files1数组

console.logfilesArrayclean和simple!!很好的回答!!我应该找reduce@mplungjan是的,明白了!没有域名替换!是的P我在代码中看到的唯一问题是,如果存在filesx或files0,1,3@viviet我认为这是您需要的答案,通过使用我建议的对象,您将松开组的索引顺序@很抱歉,我完全错过了按索引排序的问题+1简洁!!很好的回答!!我应该找reduce@mplungjan是的,明白了!没有域名替换!是的P我在代码中看到的唯一问题是,如果存在filesx或files0,1,3@viviet我认为这是您需要的答案,通过使用我建议的对象,您将松开组的索引顺序@很抱歉,我完全错过了按索引排序的问题+1此代码首先减少对象值,然后使用对象值来删除byFieldName的键-这不是很有效-这比依赖键上的数字更安全,但如果可以保证这一点,则我的代码更有效。这将按照输入数组中遇到fieldname值的顺序对最终数组进行排序。在使用此方法进行缩减之前,您需要按字段名对原始数组进行排序。对象或数组-即数据。@mplungjan可以忽略第二个控制台日志,并将此答案视为第一个未注释。如果需要检索值,您将以任何方式循环数据。将它作为结构化对象的更好之处在于,如果需要,可以使用它的键直接获取整个数组:const fn1=byFieldName[files0]使用数组时,您需要访问深层并尽快迭代。其中一些项与所需的键匹配。@pilchard Objects属性顺序在JavaScript ES2015中是可预测的-此后的循环在条目上没有差异。pilchard是的,我知道,但是对于这个建议来说,这是不必要的,它只是将它们分组并享受好处-对于@mplungjan已经解决的问题来说,不按字母顺序排列的额外迭代可能太昂贵了。-还有,我没有回答OP需要按索引排序的问题。这段代码首先减少对象值,然后取对象值,以去除byFieldName的键-这不是很有效-这比依赖键上的数字更安全,但如果保证了这一点,这样我的代码就更有效了。这将按照输入数组中遇到fieldname值的顺序对最终数组进行排序。在使用此方法进行缩减之前,您需要按字段名对原始数组进行排序。对象或数组-即数据。@mplungjan可以忽略第二个控制台日志,并将此答案视为第一个未注释。如果需要检索值,您将以任何方式循环数据。将它作为结构化对象的更好之处在于,如果需要,可以使用它的键直接获取整个数组:const fn1=byFieldName[files0]使用数组时,您需要访问深层并尽快迭代。其中一些项与所需的键匹配。@pilchard Objects属性顺序在JavaScript ES2015中是可预测的-此后的循环在条目上没有差异。pilchard是的,我知道,但是对于这个建议来说,这是不必要的,它只是将它们分组并享受好处-对于@mplungjan已经解决的问题来说,不按字母顺序排列的额外迭代可能太昂贵了。-另外,我没有回答OP需要按索引排序的问题。请接受@mplungjan的回答。我没有注意到您需要按索引0、1等进行排序。使用对象进行分组很好,但最终的顺序不会按键的字母顺序进行组织。@Roko C.Buljan已选中!我也一定会记住你的解决方案!请接受@mplungjan的回答。我错过了你需要在我之前点菜的机会
ndex 0、1等。使用对象进行分组很好,但最终顺序不会按键的字母顺序进行组织。@Roko C.Buljan已选中!我也一定会记住你的解决方案!