【问题标题】:Node WriteFile not writing objects I need using underscore. Writes the whole objects节点 WriteFile 不使用下划线写入我需要的对象。写入整个对象
【发布时间】:2018-04-17 02:40:03
【问题描述】:

我正在尝试从我的对象中仅选择某些值以写入文件。但这会写入整个对象,除非我使用 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 值,并且可以在一个单元格中。

【问题讨论】:

  • 为什么要坚持使用下划线?
  • @chsdk 代码已经写在我的另一个不使用节点的应用程序中,如果你能提供一个与最后一个条件相同的答案,我会使用它。

标签: javascript json node.js object underscore.js


【解决方案1】:

您的下划线代码似乎不起作用,因为它在您的 _.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()方法只获取employeeNameemployeeCurrentemployeePast每个object的属性。
  • 然后我们调用 .map() 在回调函数中使用 Object.values() 仅获取这些属性的值。

过滤您的 array 对象后,您可以使用 .reduce() method 将其转换为 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);
<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>

【讨论】:

  • 谢谢你如何创建和写入文件,你知道为什么我的代码不工作吗?还会有很多对象通过,并且每组都需要换行,抱歉。
  • @Sam 您的代码没有返回任何内容,我认为问题来自您使用的条件,例如最后一个 value.employeeid.length === ('id:') 将始终为 false 因为您正在尝试比较字符串转数字。
  • 这行得通,非常感谢。只剩下一个问题,它包括括号 [[ 和引号 ',我怎样才能摆脱这些?即使在第一个 return 语句中使用我的代码,如果我执行 console.log,这永远不会被打印你知道为什么吗?
  • @Sam 我认为您误用了._values() underscore Docs 中的_.values()方法,我们可以看到它没有第二个回调参数,所以我认为这里的代码回调永远不会被执行。
  • @Sam 我编辑了答案,使其将结果写成字符串,省略了双精度 [[]]
【解决方案2】:

嗯,我意识到你想在一个 plunker 中使用 lodash 和一系列函数来实现什么,这是使用的代码:

// 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:我可以解释每一个不清楚的代码块。

【讨论】:

  • 但是我将如何实现基于 OR 条件返回的最后一个条件。我只想知道为什么上面的代码不能正常工作。如果我不在其他应用程序中使用节点,它可以正常工作,所以我知道它是可以实现的
  • 你应该在第一个过滤函数中设置你的条件。
  • 好的,谢谢你能用我用过的变量替换变量并返回相同的输出吗,我给 150 分,需要看看你的代码是否可以工作:)?并解释为什么它不像我那样工作,它甚至没有进入 _ 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
  • 2017-06-27
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 2023-03-22
  • 2016-08-01
相关资源
最近更新 更多