素材牛VIP会员
一个关于json的问题
 馨***茂  分类:JavaScript  人气:1060  回帖:1  发布于6年前 收藏
var book = {
  title: "Professional Javascript",
  authors: [
    "Nicholas C. zakas",
    "Mike"
  ],
  edition: 3,
  year: 2011,
};
var jsonText = JSON.stringify(book, function(key , value){
  switch(key){
    case "authors":
      return value.join("*");
    case "year":
      return book.year+1;
    case "edition":
      return 4;
    default:
      return value;
  }
});
console.log(jsonText);

最后输出

{"title":"Professional Javascript","authors":"Nicholas C. zakas*Mike","edition":4,"year":2012}

这个我是没问题的,但是我把default那边的value随便改成一个数字之后,发现最后只返回那个值,就不返回json字符串了。
比如将

default:
  return value; 

改为

default:
  return 222;   

最后直接输出222
最后的defalut的意思应该是如果不匹配就返回那个222,为什么只会输出222呢。
一直以来感谢大家的帮助!!!!

讨论这个帖子(1)垃圾回帖将一律封号处理……

Lv6 码匠
lk***29 CEO 6年前#1
var book = {
  title: "Professional Javascript",
  authors: [
    "Nicholas C. zakas",
    "Mike"
  ],
  edition: 3,
  year: 2011,
};
var jsonText = JSON.stringify(book, function(key , value){
  console.log(key+ ' :' + value)
  return value
});
console.log(jsonText);

你会发现,得到的结果是

 :[object Object]
title :Professional Javascript
authors :Nicholas C. zakas,Mike
0 :Nicholas C. zakas
1 :Mike
edition :3
year :2011
{"title":"Professional Javascript","authors":["Nicholas C. zakas","Mike"],"edition":3,"year":2011}

而第一个key为空的那个value,是个object,打印出来,发现他正好就是book本身,由于你的filter函数直接return 222

会导致直接将book的值设置为222,导致switch全部失效。

var book = {
  title: "Professional Javascript",
  authors: [
    "Nicholas C. zakas",
    "Mike"
  ],
  edition: 3,
  year: 2011,
};
var jsonText = JSON.stringify(book, function(key , value){
  if(key=' ')
  console.log(value)
  return value
});
console.log(jsonText);

得到的结果是

{ title: 'Professional Javascript',
  authors: [ 'Nicholas C. zakas', 'Mike' ],
  edition: 3,
  year: 2011 }
Professional Javascript
[ 'Nicholas C. zakas', 'Mike' ]
Nicholas C. zakas
Mike
3
2011
{"title":"Professional Javascript","authors":["Nicholas C. zakas","Mike"],"edition":3,"year":2011}

不难发现, json.stringfy的第二个类型为函数的参数,会把传进来的参数本身,构造成key: ' ', value: value 形式进行过滤,然后再过滤属性,递归下去。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取