循环两个数组并组合数据

时间:2020-06-23 12:51:08

标签: javascript arrays ecmascript-6 vuex

我正在尝试找出做某事的最佳方法。本质上,我允许CSV上传。发生这种情况时,我会将上传状态存储在数组中,例如

tempAttachments:Array[2]
  0:Object
    _id:"12345-678910"
    bytes:412051
    file:File
    size:411532
    title:"someFile.csv"
    type:"file"
    fileType:"typeOne"
  1:Object
    _id:"9999-2222"
    bytes:12345
    file:File
    size:23456
    title:"anotherFile.csv"
    type:"file"
    fileType:"typeTwo"

当这些文件被确认并提交后,我阅读了前五行正在返回的数据。因此,我知道哪些行属于哪个文件,所以将密钥设置为fileType

返回的数据看起来像这样

data:
  0: 
    typeOne: 
      0: ["123", "21/11/2013", "10"]
      1: ["234", "22/11/2013", "20"]
      2: ["345", "12/09/2018", "100"]
      3: ["456", "22/03/2016", "350"]
      4: ["567", "13/02/2013", "50"]

所以这是文件类型为typeOne的文件的前五行。我现在想做的就是将此数组添加到tempAttachments中适当的数组元素中。

因此,我有使用数据数组的函数。然后,我假设我必须循环附件数组,并在此循环中循环数据数组。然后,我需要获取密钥,并循环这些密钥以查看是否存在匹配项。这是我到目前为止所拥有的

createFileData (state, data) {
  for (const attachment of state.tempAttachments) {
    for (const fileData of data) {
      for (const key of Object.keys(fileData)) {
        if (key === attachment.fileType) {
          console.log('Match')
        }
      }
    }
  }
}  

如您所见,它不是很亲切。所以我的问题是,是否可以使用ES6以更优雅的方式做到这一点?此外,将数据添加到附件数组的最佳方法是什么?我一直在和传播操作员一起玩,但是还没有完全掌握。

谢谢

2 个答案:

答案 0 :(得分:2)

也许您可以尝试这样

createFileData (state, data) 
{
  const types = {}; // our hashmap

  // collect all unique types
  data.forEach(item =>
  {
    Object.keys(item).forEach(key =>
    {
      types[key] = true;
    });
  });

  state.tempAttachments.forEach(attachment =>
  {
    if (attachment.fileType in types)
    {
      console.log('Match')
    }
  });
}

添加新数据

createFileData (state, data) 
{
  data.forEach(item =>
  {
    Object.entries(item).forEach((type, rows) =>
    {
      rows.forEach(row =>
      {
        state.tempAttachments.push({
          fileType: type,
          documentID: row[0],
          documentDate: row[1],
          documentAmount: row[2],
        });
      });
    });
  });
}

答案 1 :(得分:1)

如果您想尝试,这里是另一种方法

  tempAttachments=[
  {
    _id:"12345-678910",
    bytes:412051,
    file:'File',
    size:411532,
    title:"someFile.csv",
    type:"file",
    fileType:"typeOne",
  },
  {
    _id:"9999-2222",
    bytes:12345,
    file:'File',
    size:23456,
    title:"anotherFile.csv",
    type:"file",
    fileType:"typeTwo"
  }
  ]
  data={
typeOne:{
  0: ["123", "21/11/2013", "10"],
  1: ["234", "22/11/2013", "20"],
  2: ["345", "12/09/2018", "100"],
  3: ["456", "22/03/2016", "350"],
  4: ["567", "13/02/2013", "50"]
 }
} 

     
tempAttachments.forEach(o=>{Object.entries(data).forEach(y=>{ if(o.fileType==y[0]) Object.assign(o,{[y[0]]:y})})})
console.log(tempAttachments)