我正在尝试检查JSON.stringify(obj, callback)
回调中给出的值是否真的未定义。它是一个尚未定义的数组值的问题。
var a = new Array(3);
a[0] = true;
a[2] = undefined;
a.length; // 3
a.hasOwnProperty(0); // true
a.hasOwnProperty(1); // false
a.hasOwnProperty(2); // true
a.hasOwnProperty(3); // false
(a[1] === a[2]) // true
检测位置[1]
是否定义的任何想法?因为该数组有3个元素用于JSON.stringify算法。
答案 0 :(得分:3)
在数组中查找已分配的(不一定是已定义的)索引的一种方法是迭代器函数,如forEach
,忽略空插槽:< / p>
var a = new Array(3);
a[0] = true;
a[2] = undefined;
defined = []
a.forEach(function(_, n) { defined.push(n) })
alert(defined)
&#13;
因此,您可以使用虚拟迭代器仅返回已分配的项目:
a = []
a[1] = 11
a[2] = 22
a[3] = undefined
a[5] = 55
a[99] = 99
s = JSON.stringify(a, function(key, value) {
if(Array.isArray(value))
return value.filter(function() { return 1 });
return value;
});
alert(s)
&#13;
答案 1 :(得分:1)
JSON.stringify()
中的replacer
parameter具有以下内容:
key
- 要字符串化的属性的名称value
- 字符串化属性的值this
- 包含要进行字符串化的属性的当前对象你可以&#34;调试&#34;每次调用并打印如下值:
var a = new Array(3);
a[0] = true;
a[2] = undefined;
JSON.stringify(a, function(key, value) {
var s = '\n-----------'
s += '\nkey: ' + JSON.stringify(key);
s += '\nvalue: ' + JSON.stringify(value);
s += '\nthis: ' + JSON.stringify(this);
document.getElementById('result').innerHTML += s;
return value;
});
&#13;
<pre id="result"></pre>
&#13;
这表示您做可以访问this
中的原始数据。
因此,您可以按照问题中的建议组合使用简单的hasOwnProperty
,以确定是否已定义:
var a = new Array(3);
a[0] = true;
a[2] = undefined;
var result = JSON.stringify(a, function(key, value) {
// value is undefined, either explicitly or really not set
if(typeof value === "undefined") {
// property not set at all
if(!this.hasOwnProperty(key)) {
return "really undefined";
}
else {
// returning undefined from the callback will set the value to null,
// so I give another value here to demonstrate the check
return "explicitly undefined";
}
}
// has an actual value so just return it
return value;
}, " ");
document.getElementById('result').innerHTML = result;
&#13;
<pre id="result"></pre>
&#13;
我在代码注释中提到的值得强调的东西,你必须小心从回调中返回undefined
。正如我在顶级州链接的MDN文章:
注意:您无法使用replacer函数从数组中删除值。如果返回undefined或函数,则使用null。
这就是为什么debug snippet显示数组条目1和2的空值。