下划线:通过对象映射(即使未定义)
underscore: map through object (even if undefined)
我是函数式javascript的新手,我想制作一个映射,通过对象属性循环,可以告诉我,如果属性不是undefined
我试过了,在寻找其他答案后,这个:
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
编辑:
我想实现的是一个函数,给定某个对象,检查属性是否定义并且类型是否正确。我现在得到的是:
function isNumeric(value) {
return /^'d+$/.test(value);
}
function parseElement(elements, QuerySchema) {
errors = [];
// TODO: more functional with underscore
for(var key in elements) {
if(!elements.hasOwnProperty(key) || !(elements[key])) {
errors.push({code:'1', description:'Missing parameter', params:[key]});
} else {
var val = elements[key];
if( QuerySchema[key]==Number && !isNumeric(elements[key])) {
errors.push({code:'2', description:'cast error', params:[key, elements[key]]});
} else {
}
}
}
return errors;
}
,并像这样使用:
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);
...
_Objects将数组转换为对象。传递一个[键,值]对列表,或者一个键列表和一个值列表。如果存在重复的键,最后一个值优先。
_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
=> {move: 30, larry: 40, curly: 50}
_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
=> {move: 30, larry: 40, curly: 50}
因为在你的_map函数中你没有建立正确的数组,所以给了你这个错误。试一试:
_.object(_.map( elements, function(v,k) {
return [k,v];
}));
你的parse元素函数并不需要那么花哨。
function parseElement(elements, Schema) {
return _.map(elements, function(obj, key) {
return (obj != null && Schema[key] === obj.constructor) ? true : false;
})};
这个函数给你一个true和false的数组。你可以通过数组索引看到哪些值适合你,哪些不适合;
不要害怕阅读带下划线的.js源代码。
如果你只是检查对象,那么你应该使用_.each()
http://underscorejs.org/docs/underscore.html#section-13
如果你想过滤掉未定义的元素,那么你应该使用_.reject()
(我刚刚看了文档:http://underscorejs.org/#reject)
在查看了您具体在做什么之后,您应该遍历Schema
对象的键,并根据elements
对象检查它们。
如果没有为您做这些工作,我建议您查看_.keys()
- http://underscorejs.org/#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;
}
});
相关文章:
- 未捕获的引用错误:未定义<映射键>
- 使用返回时未定义的映射
- 谷歌未定义(api 映射错误)
- 函数给出错误转换未定义映射
- 树映射导致未捕获类型错误:未定义不是函数
- 打开图层映射是未定义的错误
- 为什么不能映射“未定义”数组
- JSON 对象属性在映射事件处理程序中未定义
- 未捕获的类型错误: 无法读取未定义的属性“映射”
- 避免'无法读取未定义'的属性;映射数据时出错
- 刷新映射时出现未定义的属性错误
- ReactJS映射函数找不到未定义的属性
- 为什么我的d3映射函数返回一个未定义的源属性
- Javascript & # 39;未定义# 39;变量.映射到原型函数上
- 下划线:通过对象映射(即使未定义)
- 映射内匿名函数内的方法未定义
- 通过一个未定义的数组映射循环
- 当应该返回对象数组时,数组映射返回未定义的数组
- 绕过Babel重新映射ES6“this”;未定义的
- this.point.properties是未定义的高映射