2016-05-13 27 views
2

我如何使用Node.js从文件夹中加载文件的数组,并创建对象的数组:更简洁的方法来转换文件到对象的数组,使用文件名作为关键

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

这似乎我应该能够做到这一点,而不先定义对象,使用.map()也许?

+0

你必须不管创建一个对象是什么。 'reduce()'会有助于你将初始对象作为'{}'传递。 –

+0

你可以使用'.reduce()',但我不认为它更简洁。首先定义对象有什么问题? – 2016-05-13 19:37:50

回答

1

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

也就是说,如果你真的想你可以移动对象的定义,我会在这里的,显示一个小例子只是为了显示选项

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

喜欢它。由于我在一个更大的对象中使用这个,所以首先定义对象实际上为父函数添加了更多的代码。这消除了这一要求。谢谢! – brandonscript

0

从理论上讲,你可以做

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

无论是更“简洁”是你。

的降低的解决办法是

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

相关问题