我正在嘗試從 JSON 物件獲取鍵/屬性并更改其所有值,無論是嵌套在另一個物件中還是單獨更改。
我有一個語言環境變數
const locale = "en"
我正在嘗試根據語言環境更改回傳的 json 物件的值,例如
result.navTitle = result.navTitle[locale]
or
stories.map((story)=> story.navTitle = story.navTitle[locale]);
...etc
result = [
{
"data":{
"en":"English",
"fi":"Finnish"
},
"navTitle":{
"en":"English",
"fi":"Finnish"
},
"stories": [
{
"navTitle":{"en":"English","fi":"Finnish"},
"cards":[
{
"navTitle":{"en":"English","fi":"Finnish"}
},
{
"navTitle":{"en":"English","fi":"Finnish"}
}
]
},
{
"navTitle":{"en":"English","fi":"Finnish"}
}
]
}
]
我已經設法使用重復的 .map 函式來做到這一點,但它變得很長,還有其他替代方法嗎?
uj5u.com熱心網友回復:
您可以使用遞回,。
基本上只是檢查物件陣列,如果陣列只是映射,如果它是一個物件,你可以使用 Object.entries / fromEntries 來改變,在 Object.entries 的回圈內,你可以測驗 lang,如果條目的值是一個物件,只需將其傳遞給自身作為遞回位。
下面的例子..
const result = [{"data":{"en":"English","fi":"Finnish"},"navTitle":{"en":"English","fi":"Finnish"},"stories":[{"navTitle":{"en":"English","fi":"Finnish"},"cards":[{"navTitle":{"en":"English","fi":"Finnish"}},{"navTitle":{"en":"English","fi":"Finnish"}}]},{"navTitle":{"en":"English","fi":"Finnish"}}]}];
function langObj(lang, obj) {
if (typeof obj === 'object') {
if (Array.isArray(obj)) {
return obj.map(m => langObj(lang, m));
} else {
return Object.fromEntries(
Object.entries(obj).map(([k,v]) => {
const x = v[lang] || v;
return [k, langObj(lang, x)];
})
);
}
} else {
return obj;
}
}
console.log('English');
console.log(langObj('en', result));
console.log('Finnish');
console.log(langObj('fi', result));
uj5u.com熱心網友回復:
您可以創建一個函式,比如getLocaleData()獲取每個語言環境的相關資料,采用遞回方法有選擇地克隆輸入資料。
一旦我們到達具有“en”、“fi”等屬性的子物件,我們將僅回傳與所需語言環境匹配的屬性。
const result = [ { "data":{ "en":"English", "fi":"Finnish" }, "navTitle":{ "en":"English", "fi":"Finnish" }, "stories": [ { "navTitle":{"en":"English","fi":"Finnish"}, "cards":[ { "navTitle":{"en":"English","fi":"Finnish"} }, { "navTitle":{"en":"English","fi":"Finnish"} } ] }, { "navTitle":{"en":"English","fi":"Finnish"} } ] } ]
function getLocaleData(obj, locale) {
if (!obj) return obj;
// If a property key is 'en', 'fi' etc, return the value.
if (typeof(obj[locale]) === 'string') return obj[locale];
let result = Array.isArray(obj) ? [] : {};
for (let k in obj) {
result[k] = (typeof(obj[k]) === "object") ? getLocaleData(obj[k], locale): obj[k];
}
return result;
}
console.log('\nEnglish data:', getLocaleData(result, 'en'));
console.log('\nFinnish data:', getLocaleData(result, 'fi'))
.as-console-wrapper { max-height: 100% !important; top: 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338531.html
標籤:javascript 数组 json
