通过拆分字符串将字符串数组转换为对象数组

Convert array of strings to an array of objects by splitting the strings

本文关键字:字符串 数组 转换 对象 拆分      更新时间:2023-09-26

我有大量来自 AWS S3 的字符串数组,格式如下:

1g2LNBuUNMBVppc311kZ / 1Q77N7KbUPOIOXUEJsd.xml

我想将其转换为具有文件夹名称的对象数组(字符串的第一部分直到/)和每个对象的文件数组。文件名是斜杠后面的字符串部分。例

[ { FolderName: '1g2LNBuUNMBVppc311kZ', Files: [123.xml, aba.xml] }, {} ]

关于我如何做到这一点的任何建议。

试试这个:

var array = [
  "1g2LNBuUNMBVppc311kZ / 1Q77N7KbUPOIOXUEJsd.xml",
  "1g2LNBuUNMBVppc311kZ / foo.xml",
  "foo / bar.xml"
];
var output = array.reduce(function(array, field) {
  var found = null;
  var fields = field.split(/'s*'/'s*/);
  // search for folder
  for (var i = 0; i < array.length; ++i) {
    if (array[i].folderName == fields[0]) {
      found = array[i];
      break;
    }
  }
  if (found) {
    // found folder push to files
    found.files.push(fields[1]);
  } else {
    // new folder
    array.push({folderName: fields[0], files: [fields[1]]});
  }
  return array;
}, []);
alert(JSON.stringify(output));

将数组简化为一个对象。首先为拆分逻辑制定一个辅助函数:

// convert String "path / file" into ["path", "file"]
function splitPath(string) {
  var parts = string.split('/');
  return [parts[0].trim(), parts.slice(1).join('/').trim()];
}

然后使用 reduce() 转换为对象:

function toObject(data) {
  return data.reduce(function(memo, entry) {
    var parts = splitPath(entry);
    var folder = memo[parts[0]] || [];
    folder.push(parts[1]);
    memo[parts[0]] = folder;
    return memo;
  }, {});
}

既然你要求一个对象数组,这里有如何转换它:

function toArrayOfObjects(folders) {
  Object.keys(folders).map(function(folderName) {
    return {
      FolderName: folderName,
      Files: folders[folderName]
    };
  });
}