所以我有一個像這樣的物件,它包含的屬性要么是物件,要么是物件(包含其他物件,直到它不再是物件)或來自英語和法語的文本字串陣列:
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..
uj5u.com熱心網友回復:
這是內置 JSON 庫使事情成為文字單行的情況之一:
let result = JSON.parse(JSON.stringify(langs, (key, value) =>
value instanceof Array ? value[0] : value
));
很快,我們就完成了。這個作業的原因是因為鮮為人知的第二個引數JSON.stringify,稱為替換函式。我們使用它來將每個陣列轉換為“該陣列中的第一個元素”,這就是我們所要做的。JSON.stringify實際的遞回物件為我們行走。
uj5u.com熱心網友回復:
你需要一個遞回函式。
映射條目。如果值是陣列,則回傳索引。否則,通過相同的函式遞回地運行該值。
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; }
uj5u.com熱心網友回復:
使用遞回函式,當值是陣列時回傳陣列的第一個元素,否則回傳一個新物件,其中屬性值是對該函式的遞回呼叫。
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));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/436824.html
標籤:javascript 数组 功能
