Javascript 下划线:通过对象映射(即使未定义)

Javascript 下划线:通过对象映射(即使未定义),javascript,map,underscore.js,Javascript,Map,Underscore.js,我不熟悉函数式javascript,我想制作一个循环对象属性的映射,并可以告诉我该属性是否未定义 在寻找其他答案后,我尝试了以下方法: var _ = require('underscore'); var elements = { user_id: 1, role: 'admin', username: undefined, status: 1, credits: undefined, timestamp: 12345 }; console.log

我不熟悉函数式javascript,我想制作一个循环对象属性的映射,并可以告诉我该属性是否未定义

在寻找其他答案后,我尝试了以下方法:

var _ = require('underscore');
var elements = {
    user_id: 1,
    role: 'admin',
    username: undefined,
    status: 1,
    credits: undefined,
    timestamp: 12345
};
console.log(elements);
_.object(_.map( elements, function(v,k) {
    console.log(k, v);
}));
但我被困在这个错误上:

result[list[i][0]] = list[i][1];
                      ^
TypeError: Cannot read property '0' of undefined
    at Function._.object (/private/tmp/node_tmp/node_modules/underscore/underscore.js:539:23)
    at Object.<anonymous> (/private/tmp/node_tmp/test.js:11:3)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:902:3
然后像这样使用它:

    var elements = {
        user_id: req.query.user_id,
        asset_id: req.query.asset_id,
        time_start: req.query.time_start,
        duration: req.query.duration,
        status: req.query.status,
        timestamp: req.query.timestamp
    }

    var Schema = {
        user_id: Number,
        asset_id: Number,
        time_start: Number,
        duration: Number,
        status: Number,
        timestamp: Number
    };

    var errors = parseElement(elements, Schema);
    ...

_对象将数组转换为对象。传递[键,值]对的单个列表,或键列表和值列表。如果存在重复键,则最后一个值获胜

_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
=>{moe:30,larry:40,curly:50}

_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
=>{moe:30,larry:40,curly:50}

_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
因为在_-map函数中没有构建正确的数组,所以给了您这个错误。 尝试:

您的parse元素函数不一定非得那么花哨

function parseElement(elements, Schema) {
 return _.map(elements, function(obj, key) {
 return (obj != null && Schema[key] === obj.constructor) ? true : false;
})};

此函数提供一个true和false数组。您可以通过数组索引查看哪个值适合您,哪个不适合您

不要害怕阅读下划线.js源代码

如果您只是检查一个对象,那么应该使用
\uUeach()

如果您试图过滤掉未定义的元素,那么应该使用类似于
\uu.reject()
(我刚刚查看了文档:)


在查看具体操作之后,应该遍历
模式
对象的键,并对照
元素
对象检查它们

在不为您做这些工作的情况下,我鼓励您查看
..keys()


如果您对闭包不太熟悉,下面是如何编写支票:

var pass_check = true,
    last_error = '';

_.each( obj, function( value, key ){
    if ( /* key check */ ) {
        pass_check = false;
        last_error = "Failed check: " + key;
    }
    if ( /* value check */ ) {
        pass_check = false;
        last_error = "Failed check: " + value;
    }
});

你想用这段代码做什么?您能告诉我们您想要的输出是什么吗?@redolent ok查看编辑
var pass_check = true,
    last_error = '';

_.each( obj, function( value, key ){
    if ( /* key check */ ) {
        pass_check = false;
        last_error = "Failed check: " + key;
    }
    if ( /* value check */ ) {
        pass_check = false;
        last_error = "Failed check: " + value;
    }
});