检查数组位置是否确实未定义

时间:2015-02-06 12:56:32

标签: javascript arrays json

我正在尝试检查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算法。

2 个答案:

答案 0 :(得分:3)

在数组中查找已分配的(不一定是已定义的)索引的一种方法是迭代器函数,如forEach,忽略空插槽:< / p>

&#13;
&#13;
var a = new Array(3);
a[0] = true;
a[2] = undefined;


defined = []
a.forEach(function(_, n) { defined.push(n) })
alert(defined)
&#13;
&#13;
&#13;

因此,您可以使用虚拟迭代器仅返回已分配的项目:

&#13;
&#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;
&#13;
&#13;

答案 1 :(得分:1)

JSON.stringify()中的replacer parameter具有以下内容:

  • 参数key - 要字符串化的属性的名称
  • 参数value - 字符串化属性的值
  • Bound this - 包含要进行字符串化的属性的当前对象

你可以&#34;调试&#34;每次调用并打印如下值:

&#13;
&#13;
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;
&#13;
&#13;

这表示您可以访问this中的原始数据。


因此,您可以按照问题中的建议组合使用简单的hasOwnProperty,以确定是否已定义:

&#13;
&#13;
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;
&#13;
&#13;


我在代码注释中提到的值得强调的东西,你必须小心从回调中返回undefined。正如我在顶级州链接的MDN文章:

  

注意:您无法使用replacer函数从数组中删除值。如果返回undefined或函数,则使用null。

这就是为什么debug snippet显示数组条目1和2的空值。