Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 每次都会访问JSON,即使是使用无效密钥_Javascript_Node.js_Json_Ecmascript 6_Key Value - Fatal编程技术网

Javascript 每次都会访问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

我有一个函数,里面有一个JSON,它的值包含在一个密钥对中,其中密钥作为参数接收,值是另一个函数的返回,如下所示

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的说法,这个答案更快,所以我选择这个作为更好的答案。