Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从reviver访问JSON对象内部的数组_Javascript_Arrays_Json_Node.js - Fatal编程技术网

Javascript 从reviver访问JSON对象内部的数组

Javascript 从reviver访问JSON对象内部的数组,javascript,arrays,json,node.js,Javascript,Arrays,Json,Node.js,我有一个JSON对象,其格式类似于{“Foo”:[“B”、“a”、“R”]} 我试图访问数组的值,如下所示: var json = '{"Foo": ["B","A","R"]}'; expression = JSON.Parse(json, function(key, value){ if(key == "Foo"){ console.log(value.length); // logs "3" console.log(

我有一个
JSON
对象,其格式类似于
{“Foo”:[“B”、“a”、“R”]}

我试图访问数组的值,如下所示:

var json = '{"Foo": ["B","A","R"]}';

expression = JSON.Parse(json, function(key, value){
          if(key == "Foo"){
             console.log(value.length); // logs "3"
             console.log(value[1]);     // logs "undefined"
           } 
       });
var json = '{"Foo":["B","A","R"]}';
var object = JSON.parse(json);
// object is now and object containing the data from 'json'

var expression = object["Foo"][1]; // object["Foo"] refers to the
                                   // value with key "Foo"
如果我询问值的长度,它将返回数组的正确长度,但如果我询问值,它将返回
未定义的
,我不太清楚原因。在
JSON
中还有其他值,我可以很好地访问,但它们不是数组。如有任何见解,将不胜感激。谢谢

您应该这样使用:

var json = '{"Foo": ["B","A","R"]}';

expression = JSON.Parse(json, function(key, value){
          if(key == "Foo"){
             console.log(value.length); // logs "3"
             console.log(value[1]);     // logs "undefined"
           } 
       });
var json = '{"Foo":["B","A","R"]}';
var object = JSON.parse(json);
// object is now and object containing the data from 'json'

var expression = object["Foo"][1]; // object["Foo"] refers to the
                                   // value with key "Foo"
(使用回调参数调用
JSON.parse
是转换JSON对象的高级功能,而不是读取它。不过,在几乎所有情况下,您都希望像上面的代码一样使用它,而不需要回调。)

使用此代码

   var json = {'foo' : ['B', 'A', 'R']};
   $.each(json, function(key, value){if(key == 'foo'){console.log(value[1]);}});

您已经有了一个json对象,因此无需再次解析它。

如另一个答案中所述,如果您只想检索
Foo
的第二个元素,那么在使用标准属性访问技术(如
obj.Foo[1]
进行解析后,您就可以非常轻松地进行检索

假设您确实希望使用可选的第二个“reviver”参数来解析
JSON.parse
,则需要从“reviver”回调返回值

expression = JSON.Parse(json, function(key, value){
  if (key == "Foo"){
     console.log(value[1]);
  } 
  return value;
  ^^^^^^^^^^^^^
});

看起来您无法访问值[1],但可以访问value.length的原因是(如用户663031所述)您没有返回值

reviver函数将一个值替换为另一个值,如果未指定返回,则所有函数将返回未定义的值。恢复程序接收值的顺序是:首先分别接收数组中的每个值,然后是数组


在您的代码中,每个值都已替换为“undefined”,因此数组有三个未定义的值,由长度报告
value[1]
实际上是返回位置1处的值,但它被设置为“undefined”。

当json字符串具有数组时,将使用index、[Object]作为键、值参数调用reviver函数

这段在解析阶段过滤对象属性的代码将非常有用:

    var json = '{"_embedded": [{"a":"A","b":"B","links": {"c":"C"}},{"a":"A2", "b":"B2","links": {"c":"C2"}}]}';
    var schemaNames=["_embedded", "a"];

    var result= JSON.parse(json, function(k, v) {
      console.log(k,v);
      if ("" === k){
        return v;
      }
      // On arrays k is a number
      else if (schemaNames.indexOf(k) > -1  || !isNaN(k)){
          return v;
      }
    });

    console.log(JSON.stringify(result));
输出:{uEmbedded:[{“a”:“a”},{“a”:“A2”}]}


这是您的实际代码吗<代码>值!==
Valid
JSON结构var JSON='{“Foo”:[“B”,“A”,“R”]}'有问题;双引号和单引号是冲突的。这不是我的实际代码,实际代码与其余的JSON值一起工作,但与数组不一起工作。
var JSON='{“Foo”:[“B”,“A”,“R”]};log(JSON.parse(JSON.Foo)
您的目标仅仅是访问数组中的值,还是您有特定的理由使用第二个可选的“revivier”参数来
JSON.parse
,比如想在解析对象时对其进行过滤或转换?我试图将其解析为一个对象,这样我就可以根据JSON所包含的内容构建另一个对象,这是有意义的。然而,我要尝试它没有回调。谢谢这并不能回答为什么原始代码不起作用的问题。@torazaburo确实不起作用,但在我看来,问题是回调不应该被用来简单地读取JSON对象。答案不一定是关于回答一个字面上的问题,而是关于解决一个问题,我认为我的答案试图做到这一点。同意,但这也是一个合理的假设,即这是一个最小的例子,显示了他在某些有效用例中使用复活器时遇到的问题。唯一知道的方法就是问他。我不知道我是否会说使用第二个参数是不好的做法,如果是的话,你可以打赌Crockford不会包括它。也许数据结构与他的用途不一致。第二个参数实际上是用来读取JSON的。我实际上是从一个文件中读取它,这就是为什么我必须解析它。什么是
$。每个
?什么是“JSON对象”?既然
json
是一个字符串,为什么他不必解析它呢?2016年的lol jQuery。。只需使用内置的Object.keys/Object.entries和.forEach或.map即可。