我目前正在按照系列文章学习javascript,#34;你不知道js"。
在"类型&部分中语法",在讨论" 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]}"
注意:在函数replacer的情况下,键参数k是未定义的 第一次调用(传入一个对象本身)。该 if语句过滤掉名为" c"的属性。字符串化是 递归,因此[1,2,3]数组具有其每个值(1,2和3) 作为v传递给替换者,索引(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未被过滤掉)
我错过了解作者所说的内容吗?我错过了什么吗?
答案 0 :(得分:3)
属性名称始终是字符串。 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);
答案 1 :(得分:0)
键将是表示属性名称的字符串,当迭代数组属性时,它将是表示数组索引的字符串。
JSON.stringify迭代器的工作方式是从顶部元素本身开始为对象中的所有元素执行函数。
例如,有你展示的对象:
var a = {
b: 42,
c: "42",
d: [11,22,33]
};
为JSON.stringify提供的函数将针对以下键和值运行:
{b: 42, c: "42", d: [11,22,33]}
没有密钥,因为它是顶级元素,因此在这种情况下,k
变量将为undefined
。42
访问的b
值。"42"
访问的c
值。[11,22,33]
访问的d
值。11
访问的0
值。22
访问的1
值。33
访问的2
值。