Joa*_*urz 28 javascript json stringify
当使用JSON.stringify(或类似的东西)对对象进行字符串化时,有一种方法可以限制字符串化深度,即只有n级深入到对象树中并忽略之后的所有内容(或者更好:将占位符放在那里,表示留下了一些东西出来)?
我知道这JSON.stringify需要一个表单的替换函数,function (key, value)但我没有找到一种方法来获取当前键值对的原始对象的深度,交给更换器函数.
有没有办法使用默认的JSON.stringify实现?或者我已经达到了我应该自己实现字符串化的程度?或者是否有另一个可以推荐的具有此选项的字符串化库?
Jam*_*ins 12
这是一个尊重内置JSON.stringify()规则但也限制深度的函数:
function stringify(val, depth, replacer, space) {
depth = isNaN(+depth) ? 1 : depth;
function _build(key, val, depth, o, a) { // (JSON.stringify() has it's own rules, which we respect here by using it for property iteration)
return !val || typeof val != 'object' ? val : (a=Array.isArray(val), JSON.stringify(val, function(k,v){ if (a || depth > 0) { if (replacer) v=replacer(k,v); if (!k) return (a=Array.isArray(v),val=v); !o && (o=a?[]:{}); o[k] = _build(k, v, a?depth:depth-1); } }), o||(a?[]:{}));
}
return JSON.stringify(_build('', val, depth), null, space);
}
Run Code Online (Sandbox Code Playgroud)
怎么运行的:
_build()递归调用以将嵌套对象和数组构建到请求的深度。JSON.stringify()用于迭代每个对象的直接属性以遵守内置规则。内部替换器始终返回“undefined”,因此实际上尚未构建任何 JSON。请记住,第一次调用内部替换器时,键为空(这是要字符串化的项目)。JSON.stringify()调用最终结果以生成实际的 JSON。例子:
var value={a:[12,2,{y:3,z:{q:1}}],s:'!',o:{x:1,o2:{y:1}}};
console.log(stringify(value, 0, null, 2));
console.log(stringify(value, 1, null, 2));
console.log(stringify(value, 2, null, 2));
{}
{
"a": [
12,
2,
{}
],
"s": "!",
"o": {}
}
{
"a": [
12,
2,
{
"y": 3,
"z": {}
}
],
"s": "!",
"o": {
"x": 1,
"o2": {}
}
}
Run Code Online (Sandbox Code Playgroud)
(有关处理循环引用的版本,请参见此处: https: //stackoverflow.com/a/57193345/1236397 - 包括 TypeScript 版本)
更新:修复了空数组呈现为空对象的错误。
我想在第一级对字符串进行字符串化,而不包括第三方库/太多代码.
如果您寻找相同的,这里有一个快速的单行:
var json = JSON.stringify(obj, function (k, v) { return k && v && typeof v !== "number" ? (Array.isArray(v) ? "[object Array]" : "" + v) : v; });
Run Code Online (Sandbox Code Playgroud)
例:
var json = JSON.stringify(obj, function (k, v) { return k && v && typeof v !== "number" ? "" + v : v; }); // will expose arrays as strings.
Run Code Online (Sandbox Code Playgroud)
通过在值之前添加空字符串,它会自动将值转换为字符串.但是,当元素为null或未定义时,我们需要检查键以确保不要强制转换.
对您的对象进行深度克隆(使用lodash等库),执行您想做的任何修剪,然后将其传递给 JSON.stringify。我不会尝试重新发明 JSON.stringify,这是在错误的地方所做的努力。
[编辑]看起来有人已经做了你所建议的事情: JSON.stringify 深层对象
但我不推荐这样做,因为原生 JSON.stringify 总是更快、更健壮
[编辑]这里是一个库,似乎可以做你想做的事情:http://philogb.github.io/jit/static/v20/Docs/files/Core/Core-js.html#$jit.json.prune
| 归档时间: |
|
| 查看次数: |
14218 次 |
| 最近记录: |