考虑以下代码
'use strict';
function stringify(value,p) {
function replacer(k,v) {
if (!Array.isArray(v))
return p(k) ? v : undefined;
return v
}
return JSON.stringify(value,replacer);
}
console.log(stringify([{ city: 'Milano', air_quality: 'red', temperature: 10 }, { air_quality: 'yellow', 'temperature': 20, 'sea_conditions': 3, city: 'Genova' }], k => k.match(/^[a-z]+$/)));
console.log(stringify([{ city: 'Milano', air_quality: 'red', temperature: 10 }, { air_quality: 'yellow', 'temperature': 20, 'sea_conditions': 3, city: 'Genova' }], k => k.length < 5));
我期待以下输出
[{"city":"Milano","temperature":10},{"temperature":20,"city":"Genova"}]
[{"city":"Milano"},{"city":"Genova"}]
但我正在获得
[null,null]
[{"city":"Milano"},{"city":"Genova"}]
所以基本上它适用于第二个输入,但不适用于第一个输入,我绝对无法解释为什么,唯一改变的是使用的谓词!
我知道使用以下替代品
function replacer(k,v){
if (typeof v === 'object' && !Array.isArray(v)) {
let result = {}
for (let idx in v) {
if(p(idx)) {
result[idx] = v[idx]
}
}
return result
}
return v
}
一切都会按预期工作,但是有人可以解释一下为什么在第一个版本中它只适用于一个输入而不适用于另一个输入吗?
传递给
stringify()
函数的外部数组中的键是 0 和 1。它们都不与正则表达式(查找字母)匹配,因此结果中的值是 null
(因为 undefined
不能是以 JSON 表示)。