通过拆分字符串

时间:2016-02-25 15:55:45

标签: javascript arrays

我有一大堆从AWS S3中格式化的字符串:

1g2LNBuUNMBVppc311kZ / 1Q77N7KbUPOIOXUEJsd.xml

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

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

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

2 个答案:

答案 0 :(得分:1)

试试这个:



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));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

将数组减少为对象。首先锻炼分裂逻辑的辅助函数:

// 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]
    };
  });
}