【问题标题】:JSON.stringify doesn't run replacer function on certain object propertiesJSON.stringify 不在某些对象属性上运行替换函数
【发布时间】:2020-06-10 01:53:34
【问题描述】:

我有这个特定的 JavaScript 对象:

var a = {x: Infinity, y: NaN, z: 'hello'};

当我在以下代码中使用某个替换函数(如下)在该对象上运行 JSON.stringify(a, r) 时,我得到了预期的 console.logs:

代码:

var a = {
  x: Infinity,
  y: NaN,
  z: 'hello'
};

var r = function(key, value) {
  console.log(value);

  if (typeof value === 'string') {
    return undefined;
  }

  return value;
};

console.log(JSON.stringify(a, r));

输出:

{x: Infinity, y: NaN, z: "hello"}
Infinity
NaN
hello
{"x":null,"y":null}

但是,当我对替换函数进行这个小修改时,JSON.stringify(a, r) 似乎不会遍历对象的任何属性并返回 [object Object]

var a = {
  x: Infinity,
  y: NaN,
  z: 'hello'
};

var r = function(key, value) {
  console.log(value);

  if (!isFinite(value)) {
    return value.toString();
  }

  return value;
};

console.log(JSON.stringify(a, r));

输出:

{x: Infinity, y: NaN, z: "hello"}
"[object Object]"

我正在尝试让函数返回

{"x":"Infinity", "y":"NaN", "z":"hello"}

我做错了什么?

【问题讨论】:

    标签: javascript json


    【解决方案1】:

    来自documentation

    最初,replacer 函数以一个空字符串作为键来调用,表示正在字符串化的对象。然后为正在字符串化的对象或数组上的每个属性调用它。

    这就是为什么在整个对象上调用toString 时会得到"[object Object]" 的原因

    由于在这种情况下key 是空字符串,您只需将if(key) 添加到检查的开头

    const a = {
      x: Infinity,
      y: NaN,
      z: 'hello'
    };
    
    function replacer(key, value) {
      if (key && !isFinite(value)) {
        return String(value);
      }
    
      return value;
    };
    
    console.log(
      JSON.stringify(a, replacer, 4)
    );

    【讨论】:

      【解决方案2】:

      您还需要检查类型。

      var a = { x: Infinity, y: NaN, z: 'hello' },
          r = function(key, value) {
              if (typeof value === 'number' && !isFinite(value)) return value.toString();
              return value;
          };
      
      console.log(JSON.stringify(a, r));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 2020-03-24
        • 2012-05-30
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多