我目前正在按照“您不知道js”系列学习javascript。

在“类型和语法”部分中,当讨论“ JSON.stringify”函数时,作者提到


var a = {
  b: 42,
  c: "42",
  d: [11,22,33]
};

JSON.stringify( a, ["b","c"] ); // "{"b":42,"c":"42"}"

JSON.stringify( a, function(k,v){
  if (k !== "c") return v;
} );
// "{"b":42,"d":[11,22,33]}"

  
  注意:在函数替换器的情况下,键参数k是未定义的
  第一次调用(传入对象本身)。的
  if语句过滤掉名为“ c”的属性。字符串化是
  递归的,因此[1,2,3]数组具有其每个值(1、2和3)
  以v形式传递给replacer,索引(0、1和2)为k。


因此,我给出了以下代码,目的是从22结果中删除值JSON.stringify



var a = {
  b: 42,
  c: "42",
  d: [11, 22, 33]
};

var result = JSON.stringify(a, function(k, v) {
  //since each index 0, 1, 2 of property "c" will be passed into function as "k",
  //therefore if "k !== 1" should filter out value 22
  if (k !== 1) {
    return v;
  }
});

console.log(result);





我期望结果是"{"b":42,"c":"42","d":[11,33]}"

但是,结果是"{"b":42,"c":"42","d":[11,22,33]}"(如您所见,属性c的索引1处的值22未被过滤掉)

我想念作者怎么说吗?我想念什么吗?

最佳答案

属性名称始终是字符串。 1 !== "1"。比较字符串而不是数字。



var a = {
  b: 42,
  c: "42",
  d: [11, 22, 33]
};

var result = JSON.stringify(a, function(k, v) {
  if (k !== "1") {       // "1" not 1 here
    return v;
  }
});

console.log(result);

关于javascript - 将函数传递给JSON.stringify,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45329551/

10-12 15:18