所以我有一个类似So的对象,它包含的属性要么是and object(包含其他对象,直到它不再是对象为止(,要么是英语和法语的字符串数组:
let langs = {
click : ["Click here", "Cliquez ici"],
stat : ["Fonction status", "Status de la fonction"],
no : ["Disabled", "Désactivé"],
ping : {
base : ["Pinging...", "Calcul du ping..."],
result : ["Search complete, my latency is", "Recherche terminée, ma latence est de"]
},
kick : {
error : {
msg: [
"I can't find this member, please check its writing or @!",
"Je n'ai pas trouvé ce membre, veuillez vérifier son orthographe ou son @ !"
]
}
}
}
我期望的输出是:
let langs = {
click : "Click here",
stat : "Fonction status",
no : "Disabled",
ping : {
base : "Pinging...",
result : "Search complete, my latency is"
},
kick : {
error : {
msg : "I can't find this member, please check its writing or @!"
}
}
}
我的问题是:有没有一种方法可以动态复制该对象,使我的输出完全相同,但数组只能是第一个或第二个元素的字符串?我知道如何将对象的属性设置为(例如(第一个元素
let langs = { a : ["1","2"], b : ["3","4"] }
Object.keys(langs).forEach(n =>{
langs[n] = langs[n][0]
})
console.log(langs)
但是对象";langs";不仅可以是数组,还可以是包含数组的对象或包含数组的目标的对象等。。如果能有一个函数,那就太棒了。。
let langs = { a : ["1","2"], b : ["3","4"] };
langs = onlySelectIndexElement(langs,0) // Or 1 if I want the second element etc..
这是内置JSON库使事物成为字面上的一行的情况之一:
let result = JSON.parse(JSON.stringify(langs, (key, value) =>
value instanceof Array ? value[0] : value
));
很快,我们就完了。这之所以有效,是因为JSON.stringify
的第二个参数鲜为人知,称为replacer函数。我们用它来把每个数组变成";该数组中的第一个元素";,这就是我们所要做的。JSON.stringify
为我们做实际的递归对象行走。
您需要一个递归函数。
映射条目。如果该值是一个数组,则返回索引。否则,通过相同的函数递归地运行该值。
const onlySelectIndexElement = (obj, index) =>
Object.fromEntries(
Object.entries(obj).map(([ key, val ]) => [
key,
Array.isArray(val) ? val[index] : onlySelectIndexElement(val, index)
])
)
const langs = {"click":["Click here","Clique ici"],"stat":["Fonction status","Status de la fonction"],"no":["Disabled","Désactivé"],"ping":{"base":["Pinging...","Calcul du ping..."],"result":["Search complete, my latency is","Recherche terminée, ma latence est de"]},"kick":{"error":{"msg":["I can't find this member, please check its writing or @!","Je n'est pas trouvé ce membre, veuillez vérifier son écriture ou son @ !"]}}}
console.log("en", onlySelectIndexElement(langs, 0))
console.log("fr", onlySelectIndexElement(langs, 1))
.as-console-wrapper { max-height: 100% !important; }
当值是数组时,使用递归函数返回数组的第一个元素,否则返回一个新对象,其中属性值是对函数的递归调用。
let langs = {
click: ["Click here", "Clique ici"],
stat: ["Fonction status", "Status de la fonction"],
no: ["Disabled", "Désactivé"],
ping: {
base: ["Pinging...", "Calcul du ping..."],
result: ["Search complete, my latency is", "Recherche terminée, ma latence est de"]
},
kick: {
error: {
msg: [
"I can't find this member, please check its writing or @!",
"Je n'est pas trouvé ce membre, veuillez vérifier son écriture ou son @ !"
]
}
}
}
function mycopy(obj) {
if (Array.isArray(obj)) {
return obj[0];
}
return Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, mycopy(value)]));
}
console.log(mycopy(langs));