节点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值逐行返回并可以在一个单元格中。

Solutions Collecting From Web of "节点WriteFile不写我需要使用下划线的对象。 写入整个对象"

那么你的下划线代码似乎不工作,因为它不会返回任何结果在_.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 employeeNameemployeeCurrentemployeePast属性。
  • 然后我们回想一下.map() Object.values()在callback函数中只使用Object.values()获取这些Object.values()的值。

筛选对象array后,可以使用如下所示的.reduce()方法将其转换为string

 var filteredResult = filteredObjects.reduce(function(acc, currentValue) { return accumulator + currentValue.join(" \n"); }).join(" ,"); 

然后将filteredResultstringvariables的内容写入您的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:我可以解释每一个不清楚的代码块。