节点WriteFile不写我需要使用下划线的对象。 写入整个对象
我试图从我的对象中只select某些值写入文件。 但是这写的整个对象,除非我使用util.inspect它只是写作对象。 这应该写入我从对象中逐行select的值,
var objectsToFile = function(objectsTotal){ objectsTotal = _.values(objectsTotal, function(value) { return value.objectTo.employeeName; }); objectsTotal = _.values(objectsTotal, function(value) { return value.employeeCurrent; }); objectsTotal = _.values(objectsTotal, function(value) { return value.employeePast; }); writeFile('objectsTotalet.csv', util.inspect(objectsTotal), function(err) { if (err) console.log(err); }); };
objectsTotal通过如下函数来实现:
[ { objectTo: { employeeName: 'John', employeeID: '234234', DOB: '2333'}, employeeCurrent: true, employeePast: false}, { objectTo: { employeeName: 'Janet', employeeID: '23423432', DOB: '23333' }, employeeCurrent:true, employeePast: false} ]
输出将是有条件的这就是为什么我使用下划线库,但它不起作用它甚至不使用从下划线返回的值:
将会有其他的值添加到对象,所以还需要添加一个返回值,如:
objectsTotal = _.values(objectsTotal, function(value) { return value.employeeStatus != 'employed' || value.url.indexOf('employee:') === -1 || value.employeeid.length === ('id:') });
我需要使用这个库来提供我想要的CSV文件中的结果。 输出将看起来像objectsTotal值逐行返回并可以在一个单元格中。
那么你的下划线代码似乎不工作,因为它不会返回任何结果在_.values()
调用。
我想你是错误的使用_.values()
的_.values()
方法下划线文档我们可以看到,它没有第二个参数的callback
,所以我认为这个callback代码将永远不会执行。
解:
无论如何,这可以通过纯JavaScript代码来实现:
var filteredObjects = objectsTotal.filter(function(value) { return value.objectTo.employeeStatus != 'employed'; }).map(function(obj) { return { employeeName: obj.objectTo.employeeName, employeeCurrent: obj.employeeCurrent, employeePast: obj.employeePast } }).map(function(o) { return Object.values(o); });
说明:
- 我们使用
.filter()
方法来过滤具有指定条件的对象,我只用了一个testing,但是你可以实现所有的testing,它会给我们一个所有匹配这些条件的对象的array
。 - 然后我们使用
.map()
方法来获取每个object
employeeName
,employeeCurrent
和employeePast
属性。 - 然后我们回想一下
.map()
Object.values()
在callback函数中只使用Object.values()
获取这些Object.values()
的值。
筛选对象array
后,可以使用如下所示的.reduce()
方法将其转换为string
:
var filteredResult = filteredObjects.reduce(function(acc, currentValue) { return accumulator + currentValue.join(" \n"); }).join(" ,");
然后将filteredResult
stringvariables的内容写入您的csv
文件中:
writeFile('objectsTotalet.csv', filteredResult, function(err) { if (err) console.log(err); });
演示:
var objectsTotal = [{ objectTo: { employeeName: 'John', employeeID: '234234', DOB: '2333', employeeStatus: 'employed' }, employeeCurrent: true, employeePast: false }, { objectTo: { employeeName: 'Janet', employeeID: '23423432', DOB: '23333', employeeStatus: 'unemployed' }, employeeCurrent: true, employeePast: false } ]; var filteredObjects = objectsTotal.filter(function(value) { return value.objectTo.employeeStatus != 'employed'; }).map(function(obj) { return { employeeName: obj.objectTo.employeeName, employeeCurrent: obj.employeeCurrent, employeePast: obj.employeePast } }).map(function(o) { return Object.values(o); }); var filteredResult = filteredObjects.reduce(function(acc, currentValue) { return accumulator + currentValue.join(" \n"); }).join(" ,"); console.log(filteredResult);
<script src="http://underscorejs.org/underscore-min.js"></script> <script data-require="lodash.js@*" data-semver="4.17.4" src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js"></script>
那么,我意识到你想在一个使用lodash和一系列多function链接的情况下实现的目标,这是使用的代码:
// First, do your filtering conditions here var game = data.filter(g => { return g.debit === true; }); // Then, pick the wanted attributes here game = _.map(game, (g) => { var o = _.pick(g, ['amount', 'debit']); o = Object.values(o); return o; }); // Finally merge your arrays here var merged = [].concat.apply([], game);
要将数组打印到csv中,只需在打印function中使用最终的合并数组。
这里是plunker链接: http ://plnkr.co/edit/uvH4Ww4HMaQQVXQCBVKP
我希望我根据需要回答你的问题。
PS:我可以解释每一个不清楚的代码块。