JavaScript对象的数组:如果满足条件,则更改一个键的值和数据类型

时间:2015-05-04 15:35:40

标签: javascript mongoose underscore.js

我使用Mongoose从MongoDB集合中提取一些数据。我只用我选择过的字段来取回我的对象​​数组。都好。这是我的代码:

var fieldsToReturn = 'username password';
User.find({username: {$exists: true}}, fieldsToReturn, {sort: {'created.when': 1}}, function(err, data){
  if (err) {
    return err;
  } else {
    // clever code needed here to manipulate the data!
    return res.json(data);
  }
});

我想要做的是遍历data中返回的JavaScript对象数组,如果有密码(它将是一个文本字符串),用布尔值替换password { {1}},但如果它是true,则返回布尔值null

我尝试了一些下划线.js魔术:

false

但我在JSON中收到的内容是_.each(data, function(element, index, list){ if (element.password !== null) {element.password = true}; }); 不是 "password":"true"。还尝试了"password":true。有什么建议吗?

3 个答案:

答案 0 :(得分:0)

您可以使用map

data = data.map(function(element) {
  if (element.password) {
    element.password = true;
  }
  return element;
});



var data = [
    {
        password: 'secret'
    },
    {
        password: ''
    },
    {
        password: 'swordfish'
    }
];

data = data.map(function(element) {
    if (element.password) {
        element.password = true;
    }
    return element;
});

document.querySelector('pre').innerText = JSON.stringify(data);

<pre></pre>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

尝试使用asyncjs lybrary。完成数组对象的所有执行后,它将调用回调函数。另请r ead carefully关于javascript(nodejs)中的异步流。

希望它有所帮助!!

 //this should work if placed on your clever code and installed asyncjs
 async.map(data, checkPassword, function(err, results){
  //when arrived here, all the array has been checked and modified
  console.log(results);
 }

 //Remember This function must be placed outside of the find() method. 
 function checkPassword(obj, callback)
 {
   if (obj.password) {
   obj.password = true;
   }
   return callback(null, obj);
 }

答案 2 :(得分:0)

它是猫鼬。在返回数据之前发生了一些事情,这使得它看起来像是直接的JSON,但如果您尝试在element循环中操作_.each,那么您正在处理的对象({{1} })isn&#39;简单对象映射到MongoDB中的文档。哪有Mongoose专家可以解释这个问题?

我要解决的问题是使用LoDash&#39; element

_.mapValues

然后在代码中:

function renderUserKeys(obj){
  var newObj = _.mapValues(obj, function(n){return n});
  if (newObj.password !== null) {newObj.password = true};
  return newObj;
};

也许有一个更好的功能... } else { var newArray = []; _.each(data, function(element, index, list){ newArray.push(renderUserKeys(element._doc)); // note the ._doc }); return res.json(newArray); }; (也许是_.mapValues?)来执行复制,我需要调查一下,但是现在这个工作和我的Mongoose中间件是仍然正常运行(因为我使用_.merge )。

经验教训:猫鼬!==鸭子。就像在,它可能看起来像一个对象,但当你尝试和操纵它时,它并没有像你期望的那样表现!