节点WriteFile不使用下划线编写我需要的对象.写入整个对象

Sam*_*Sam 7 javascript json object node.js underscore.js

我试图只从我的对象中选择某些值来写入文件.但这写了整个对象,除非我使用util.inspect,它只是写为对象.这应该写入我从对象中逐行选择的值:

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);
        });
};
Run Code Online (Sandbox Code Playgroud)

objectsTotal来自如下函数:

[ { objectTo:                        
 { employeeName: 'John',         
   employeeID: '234234', 
   DOB: '2333'},         
employeeCurrent: true,
employeePast: false},  
{ objectTo:                        
 { employeeName: 'Janet',         
   employeeID: '23423432', 
   DOB: '23333' },        
employeeCurrent:true,
employeePast: false} ]
Run Code Online (Sandbox Code Playgroud)

输出将是有条件的,这就是为什么我使用下划线库但它不起作用它甚至不使用下划线返回的值:

将向对象添加其他值,因此还需要添加返回值,如:

objectsTotal = _.values(objectsTotal, function(value) {
        return value.employeeStatus != 'employed' ||
        value.url.indexOf('employee:') === -1 ||
        value.employeeid.length === ('id:')
});
Run Code Online (Sandbox Code Playgroud)

我确实需要使用这个库在csv文件中提供我想要的结果.输出看起来像逐行返回的objectsTotal值,可以在一个单元格中.

cнŝ*_*ŝdk 2

那么您的下划线代码似乎不起作用,因为它在您的_.values()调用中没有返回任何结果。

我认为您错误地使用了下划线文档_.values()中的方法,我们可以看到它没有 a 的第二个参数,所以我认为这个回调中的代码永远不会被执行。_.values()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);
});
Run Code Online (Sandbox Code Playgroud)

解释:

  • 我们使用.filter()方法来过滤具有指定条件的对象,我只使用了一个测试,但您可以实现所有测试,它会给我们一个array包含所有符合这些条件的对象的结果。
  • 然后我们使用.map()方法来获取 onlyemployeeNameemployeeCurrent每个employeePast的属性object
  • 然后我们记得在回调函数中.map()仅获取这些属性的值。Object.values()

过滤您的arrayof 对象后,您可以将其转换为如下的stringusing.reduce()方法:

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

filteredResult然后将字符串变量的内容写入您的csv文件:

writeFile('objectsTotalet.csv', filteredResult, function(err) {
    if (err) console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

演示:

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);
});
Run Code Online (Sandbox Code Playgroud)
var filteredResult = filteredObjects.reduce(function(acc, currentValue) {
    return accumulator + currentValue.join(" \n");
}).join(" ,");
Run Code Online (Sandbox Code Playgroud)