首页 > 解决方案 > 我需要返回 null 作为名为 null 的键的值,但它一直返回未定义

问题描述

我有一个 parseJSON 函数,其结果应该与传递相同输入时调用 JSON.parse 的结果完全匹配。我有一个名为 getParsed() 的辅助函数,它将字符串解析为正确的类型。我的问题:

parseJSON('{"boolean, true": true, "boolean, false": false, "null": null }') // 返回{boolean, true: true, boolean, false: false, null: undefined}

我需要最后一个属性返回

null: null

为了匹配 JSON.parse() 的结果

我确定我在这里缺少关于 null 的性质的一些东西,但我找不到解决问题的方法。下面的代码片段(截至目前,该函数仅处理对象文字)。

var getParsed = str => {
  // Check if string is a number. Checks for floating point and integer
  if (/^-?\d*\.?\d+$/.test(str)) {
    if (str.includes('.')) {
      return parseFloat(str);
    } else {
      return parseInt(str);
    }
  }
  // Check if string is surrounded by quotes, wwill remain a string.
  if (/"[^"]*()[^"]*"/.test(str)) {
    var arr = str.split('');
    arr.pop();
    arr.shift();
    return arr.join('');
  }
  // Check if string is boolean
  if (str === 'true') { return true; }
  if (str === 'false') { return false; }
  // Check if string is false
  if (str === 'null' || str === 'undefined') { return null; }
};



var parseJSON = function (json, invoked = false) {
  if (json.startsWith('{')) {
    var arr = json.split('');
    var first = arr.shift();
    var last = arr.pop();
    var props = arr.join('').split(', ');
    var res = {};

    for (var i = 0; i < props.length; i++) {
      if (!props[i].includes(':')) {
        props[i] = props[i] + ', ' + props[i + 1];
        props.splice(i + 1, 1);
      }
    }

    for (var i = 0; i < props.length; i++) {
      var prop = props[i].split(': ');
      var key = prop[0];
      var val = prop[1];

      if (key.includes('"')) {
        key = key.split('');
        key.shift();
        key.pop();
        key = key.join('');
        res[key] = getParsed(val);
      }
    }

    return res;
};

标签: javascriptjsonparsingnullkey-value

解决方案


通过把这个:

console.log({str:str, test: (str === 'null')})

在第一行getParsed,你会看到你的问题。

{str: 'null ', test: false}

所以你在那个函数中的最终测试失败了,然后因为它没有返回任何东西,你undefined在你的最终对象中得到了一个值。

确保你去掉你的空间,它会起作用:)


推荐阅读