gpt4 book ai didi

javascript - 调用 JSON.stringify 时检测父对象

转载 作者:行者123 更新时间:2023-12-02 07:57:28 27 4
gpt4 key购买 nike

我有一个对象,即:

{
item1: "value1",
item2: "value2",
item3: {
item4: "value4",
item5: "value5"
}
}

我想将 JSON.stringifyreplacer 函数一起使用,该函数将 对项目 4 和 5(项目 3 的内部属性)采取不同的行动.
那怎么办?

类似于以下伪代码:

     return JSON.stringify(obj, (key, val) => {
if (key is child of Item3) {
return someOtherValue;
} else {
return val;
}
}

所需的输出是 json。即:

{ 
"item1" : "value1",
"item2" : "value2",
"item3" : {
"item4" : "theSomeOtherValue",
"item5" : "theSomeOtherValue"
}

编辑:
第 4 和第 5 项事先不知道,它们是动态生成的。
我只知道 item3 在运行时的标题

最佳答案

您至少可以在这里采取两种方法。

  1. 在replacer函数中,this是正在处理的对象,所以在处理item4item5时,this 指的是 item3 对象。因此,如果该对象有任何东西可以让您识别它,您可以通过查看 this 来做到这一点。 (请务必使用传统函数,而不是箭头函数,以便 JSON.stringify 在替换器调用期间可以设置 this 是什么。)

    <
  2. 调用replacer函数时需要处理key和value,所以如果对象的key("item3")是唯一的,你可以在看到它的时候进行特殊处理.

这里有几个#1的例子:

例如,如果您有对对象的引用,则可以将 thisobj.item3 进行比较:

const obj = {
item1: "value1",
item2: "value2",
item3: {
item4: "value4",
item5: "value5"
}
};
console.log(JSON.stringify(obj, function(key, value) {
// ^^^^^^^^^−−−−− Traditional function, not arrow function
if (this === obj.item3) {
console.log("do something different, it's " + key);
return "theSomeOtherValue";
}
return value;
}));

如果您没有对它的引用,您可以使用您拥有的任何其他识别信息。例如,通过示例数据,您可以看到它具有 item4item5 属性:

console.log(JSON.stringify({
item1: "value1",
item2: "value2",
item3: {
item4: "value4",
item5: "value5"
}
}, function(key, value) {
// ^^^^^^^^^−−−−− Traditional function, not arrow function
if (this.hasOwnProperty("item4") && this.hasOwnProperty("item5")) {
console.log("do something different, it's " + key);
return "theSomeOtherValue";
}
return value;
}));

不过,这只是两个例子;关键是 this 是被字符串化的对象。

这是#2的一个例子:

console.log(JSON.stringify({
item1: "value1",
item2: "value2",
item3: {
item4: "value4",
item5: "value5"
}
}, (key, value) => { // It's okay if this one is an arrow function, we're not relying on
// `JSON.stringify` setting `this` for us
if (key === "item3") {
return {
item4: "theSomeOtherValue",
item5: "theSomeOtherValue"
};
}
return value;
}));

如果你需要正在处理的对象的完整路径,那就有点麻烦了,但你可以得到它:

let paths = new Map();
console.log(JSON.stringify({
item1: "value1",
item2: "value2",
item3: {
item4: "value4",
item5: "value5"
},
item6: {
item3: {
item4: "non-special item4",
item5: "non-special item5"
}
}
}, function(key, value) {
// ^^^^^^^^^−−−−− Traditional function, not arrow function
const path = paths.get(this);
// Special processing for the properties of root.item3
if (path === "root.item3") {
return key === "item4" || key === "item5"
? "theSomeOtherValue"
: value;
}

// Keep track of the path of the object
for (const [k, v] of Object.entries(this)) {
if (typeof v === "object") {
if (path) {
// The regex checks for property names that aren't valid(ish)
// property names so we can use brackets notation
paths.set(v, path + (/^\w+$/.test(k) ? "." + k : `[${JSON.stringify(k)}]`));
} else {
paths.set(v, "root");
}
}
}
return value;
}));

关于javascript - 调用 JSON.stringify 时检测父对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61970008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com