【问题标题】:passing a function into JSON.stringify将函数传递给 JSON.stringify
【发布时间】:2017-07-26 14:14:50
【问题描述】:

我目前正在按照“你不懂js”系列学习javascript。

在“types & grammer”一节中,作者在讨论“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 传递给替换器,索引(0、1 和 2)为 k。

所以我提出了以下代码,旨在从 JSON.stringify 结果中删除值 22

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 未被过滤掉)

我是否错过了理解作者所说的内容?我错过了什么吗?

【问题讨论】:

  • @Kaddath — 否。替换函数是递归运行的。
  • @Quentin thx,我没有集中注意力,它写在问题中!你每天都在学习..

标签: javascript json


【解决方案1】:

属性名称总是字符串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);

【讨论】:

  • 您好昆汀,非常感谢您的回答。你介意我问一个后续问题吗?我想知道作者所说的the key argument k is undefined for the first call (where the a object itself is being passed in) 是什么意思。为什么对象a 本身作为参数传递给anonymous function?这种逻辑的目的是什么?
  • 我想不出任何用途。 (这并不意味着没有。)
  • 有时我只是不明白javascript是如何工作的,哈哈。只是想知道,您是否知道我在哪里可以找到“JSON.stringify”方法的实现(即源代码)?很想知道它是如何在内部实现的。
  • 谁在执行?
【解决方案2】:

键是表示属性名称的字符串,当遍历数组属性时,键是表示数组索引的字符串。

JSON.stringify 迭代器的工作方式是对对象中从顶部元素本身开始的所有元素执行函数。

例如拥有您展示的对象:

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

为 JSON.stringify 提供的函数将为以下键和值运行:

  • 所有对象{b: 42, c: "42", d: [11,22,33]} 没有键,因为它是顶级元素,所以在这种情况下k 变量将为undefined
  • 由键 b 访问的 42 值。
  • c 键访问的 "42" 值。
  • 由键 d 访问的 [11,22,33] 值。
  • 0 键访问的 11 值。
  • 由键 1 访问的 22 值。
  • 2 键访问的 33 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2020-07-28
    • 2013-01-27
    • 2014-09-10
    • 2013-01-10
    • 2010-11-01
    • 2016-04-27
    • 2014-04-10
    相关资源
    最近更新 更多