使用文件名作为键将文件数组转换为对象的更简洁方法

时间:2016-05-13 19:30:49

标签: javascript arrays javascript-objects map-function

我使用Node.js从文件夹加载文件数组并创建一个对象数组:

var files = {}
fs.readdirSync(dir).forEach(function(file) {
    files[file] = fs.readFileSync(dir + '/' + file)
})

这似乎我应该能够在不首先定义对象的情况下执行此操作,使用.map()可能吗?

3 个答案:

答案 0 :(得分:1)

使用地图不会重现您的示例。它将构造一个对象数组。整个练习本质上是一个微观优化,你有什么工作,可读,所以我建议只使用它。

那就是说,你可以移动对象定义,如果你真的想要,我会在这里展示一个小例子来展示选项

var files = fs.readdirSync(dir).reduce(function(obj,file) {
    return (obj[file] = fs.readFileSync(dir + '/' + file),obj)
},{})

答案 1 :(得分:0)

理论上你可以做到

Object.assign({}, ...fs.readdirSync(dir) .
  map(
   file => ({[file]: fs.readFileSync(dir + '/' + file})
  )
);

是否更多"简洁"由你决定。

reduce解决方案将是

fs.readdirSync(dir) .
  reduce(
    (result, file) => {
      result[file] = fs.readFileSync(dir + '/' + file);
      return result;
    },
    {}
  );

fs.readdirSync(dir) . 
  reduce(
    (result, file) =>
      result.defineProperty(file, {
        value: fs.readFileSync(dir + '/' + file)
      }),
    {}
  );

这些似乎都不像你提出的代码那么明显。

下划线可以将一组对变换为一个对象,所以你可以做

_.object(fs.readdirSync(dir) . 
  map(
    file =>
      [file, fs.readFileSync(dir + '/' + file]
  )
);

答案 2 :(得分:0)

正如其他人所说,你可以用这个(可以说是丑陋的)reduce来做到这一点。

var files = fs.readdirSync(dir).reduce(function(files, file) {
  files[file] = fs.readFileSync(dir + '/' + file);
  return files;
}, {});

为了使这个更好用,你可以将它包装在辅助函数中,甚至可以扩展Array原型(不建议但看起来更清洁)。



function log(msg) {
  document.querySelector('pre').innerText += msg + '\n';
}

var filesInDir = ['a.txt', 'b.txt', 'c.txt'];
var files;

// Helper function
function toObject(arr, map) {
  return arr.reduce(function(obj, value) {
    obj[value] = map(value);
    return obj;
  }, {});
};

files = toObject(filesInDir, function(file) {
  return file + '_mapped';
});
log('Helper');
log(JSON.stringify(files, null, 2));


// Modify the prototype (not recommended)
Array.prototype.toObject = function(map) {
  return this.reduce(function(obj, value) {
    obj[value] = map(value);
    return obj;
  }, {});
};

files = filesInDir.toObject(function(file) {
  return file + '_mapped';
});

log('Prototype');
log(JSON.stringify(files, null, 2));

<pre></pre>
&#13;
&#13;
&#13;