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

时间:2017-11-04 13:49:19

标签: javascript json node.js object 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);
        });
};

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值,可以在一个单元格中。

2 个答案:

答案 0 :(得分:2)

您的下划线代码似乎不起作用,因为它不会在_.values()来电中返回任何结果。

我认为你错误地使用了_.values() underscore Docs中的_.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);
});

<强>解释

  • 我们使用 .filter() 方法来过滤具有指定条件的对象,我只使用了一个测试,但您可以实现所有测试,它会为我们提供array所有符合这些条件的物品。
  • 然后我们使用 .map() 方法仅获取每个employeeName的{​​{1}},employeeCurrentemployeePast属性。
  • 然后我们回想一下 .map() ,只使用回调函数中的 Object.values() 来获取这些值的值。

过滤了object个对象后,您可以使用 .reduce() method 将其转换为array,如下所示:

string

然后将var filteredResult = filteredObjects.reduce(function(acc, currentValue) { return accumulator + currentValue.join(" \n"); }).join(" ,"); 字符串变量的内容写入filteredResult文件:

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

答案 1 :(得分:1)

好吧,我意识到你想要使用带有多个函数链的lodash在一个plunker中实现,这是使用的代码:

// 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中,您只需在打印功能中使用最终合并数组。

以下是plunker链接:http://plnkr.co/edit/uvH4Ww4HMaQQVXQCBVKP

我希望我能根据需要回答你的问题。

PS:我可以解释每个代码块都不清楚。