Javascript 每次都会访问JSON,即使是使用无效密钥
我有一个函数,里面有一个JSON,它的值包含在一个密钥对中,其中密钥作为参数接收,值是另一个函数的返回,如下所示Javascript 每次都会访问JSON,即使是使用无效密钥,javascript,node.js,json,ecmascript-6,key-value,Javascript,Node.js,Json,Ecmascript 6,Key Value,我有一个函数,里面有一个JSON,它的值包含在一个密钥对中,其中密钥作为参数接收,值是另一个函数的返回,如下所示 const normalizeKeyValuePair = (key, value) => { const propertyHandler = { speed: normalizeSpeed(value), actions: normalizeActions(value) }; return [normalizeField(key), proper
const normalizeKeyValuePair = (key, value) => {
const propertyHandler = {
speed: normalizeSpeed(value),
actions: normalizeActions(value)
};
return [normalizeField(key), propertyHandler[key] || normalizeValue(value)];
};
问题在于操作
键。normalizeKeyValuePair
接收到的每个键
参数都被抛出到操作
并转到normalizeActions
。我怎样才能防止这种情况发生
要了解这是一个问题的原因,请参见规范化操作
。当actions
是原语时,JS抛出一个错误
const normalizeActions = actions => {
const normalizedActions = [];
for(let action of actions) {
normalizedActions.push([action.name, action.desc]);
}
return normalizedActions;
}
提前谢谢。如果需要更多信息,请告诉我 逻辑似乎全错了。在调用normalize函数之前,应该选中
键
,并且只调用适当的函数
const normalizeValuePair(key, value) {
let normalKey = normalizeField(key);
let normalValue;
switch(value) {
case 'speed':
normalValue = normalizeSpeed(value);
break;
case 'actions':
normalValue = normvalizeActions(value);
break;
default:
normalValue = normalizeValue(value);
}
return [normalKey, normalValue];
}
看来逻辑是完全错误的。在调用normalize函数之前,应该选中
键
,并且只调用适当的函数
const normalizeValuePair(key, value) {
let normalKey = normalizeField(key);
let normalValue;
switch(value) {
case 'speed':
normalValue = normalizeSpeed(value);
break;
case 'actions':
normalValue = normvalizeActions(value);
break;
default:
normalValue = normalizeValue(value);
}
return [normalKey, normalValue];
}
每次调用
normalizeKeyValuePair
时,它将在创建propertyHandler
时调用normalizeActions(value)
这应该符合您的意图:
const propertyHandler = {
speed: normalizeSpeed,
actions: normalizeActions
};
const normalizeKeyValuePair = (key, value) => {
const ph = propertyHandler[key];
return [normalizeField(key), (ph && ph(value)) || normalizeValue(value)];
};
每次调用
normalizeKeyValuePair
时,它将在创建propertyHandler
时调用normalizeActions(value)
这应该符合您的意图:
const propertyHandler = {
speed: normalizeSpeed,
actions: normalizeActions
};
const normalizeKeyValuePair = (key, value) => {
const ph = propertyHandler[key];
return [normalizeField(key), (ph && ph(value)) || normalizeValue(value)];
};
对于原语,
normalizeActions
应该返回什么?不应该为原语调用它normalizeActions
应该只为数组调用。但是,当调用primitve时,JS抛出一个错误,指出操作不可编辑
在这种情况下,您希望在属性handler.actions中放置什么?这可能表示缺乏关于JS如何工作的知识,但是如果我尝试使用“错误”键访问属性handler
,例如propertyHandler[name]
,我是否应该将未定义作为响应?是的,您可以。我不确定这与它有什么关系。normalizeActions
应该为原语返回什么?不应该为原语调用它normalizeActions
应该只为数组调用。但是,当调用primitve时,JS抛出一个错误,指出操作不可编辑
在这种情况下,您希望在属性handler.actions中放置什么?这可能表示缺乏关于JS如何工作的知识,但是如果我尝试使用“错误”键访问属性handler
,例如propertyHandler[name]
,我是否应该将未定义作为响应?是的,您可以。我不确定这和它有什么关系。我不认为“错”这个词在这里用。但请帮助我理解:如果我遵循cybersam响应,那么开关(键)
如何成为更好的方式呢?是的,也许这很苛刻,只是看起来有些倒退。您正在执行一系列规范化,然后使用属性测试选择要返回的规范化。但是你可以简单地做一个你真正想要的标准化。cybersam的方法也很好,我只是没想到。哦,我明白了。我将做一些测试,看看哪种解决方案更快,然后选择一种获胜的解决方案。非常感谢。这一差异可能可以忽略不计。JS编译器甚至可能在内部将开关转换为类似的代码。随你的便。我不认为这里用“错”这个词。但请帮助我理解:如果我遵循cybersam响应,那么开关(键)
如何成为更好的方式呢?是的,也许这很苛刻,只是看起来有些倒退。您正在执行一系列规范化,然后使用属性测试选择要返回的规范化。但是你可以简单地做一个你真正想要的标准化。cybersam的方法也很好,我只是没想到。哦,我明白了。我将做一些测试,看看哪种解决方案更快,然后选择一种获胜的解决方案。非常感谢。这一差异可能可以忽略不计。JS编译器甚至可能在内部将开关转换为类似的代码。随你的便。好吧,这很有道理,泰!虽然Barmar的回答也有道理,但根据JSPerf的说法,这一个更快,所以我选择这一个作为更好的答案。好吧,这很有道理,ty!虽然Barmar的回答也有道理,但根据JSPerf的说法,这个答案更快,所以我选择这个作为更好的答案。