javascript - 从包含数组属性的基础对象有选择地创建一个新的对象数组
问题描述
我有一个名为的对象obj
,它将用作以某种格式创建新的对象数组的基础。
我的基础对象:
var obj={
"en": [{
"faq": "faq",
"about": "about"
}],
"hi": [{
"faq": "aksar-poochhe-jaane-vaale",
"about": "hamaare-baare"
}]
}
我创建了一个getObj()
接受两个参数lang
和基础对象的函数obj
的函数。
示例场景
当我打电话时:
getObj("en", obj);
我应该得到:
[{
"url": "/en/faq",
"links": [
{ lang: 'en', url: '/en/faq' },
{ lang: 'hi', url: '/hi/aksar-poochhe-jaane-vaale' }
]
},
{
"url": "/en/about",
"links": [
{ lang: 'en', url: '/en/about' },
{ lang: 'hi', url: '/hi/hamaare-baare' }
]
}]
当我打电话时:
getObj("hi", obj);
我应该得到:
[{
"url": "/hi/aksar-poochhe-jaane-vaale",
"links": [
{ lang: 'en', url: '/en/faq' },
{ lang: 'hi', url: '/hi/aksar-poochhe-jaane-vaale' }
]
},
{
"url": "/hi/hamaare-baare",
"links": [
{ lang: 'en', url: '/en/about' },
{ lang: 'hi', url: '/hi/hamaare-baare' }
]
}]
以下是我尝试过的:
function getObj(lang, obj){
var newobj = {};
newobj['url'] = "/"+ lang +"/"+obj[lang].map(e=>e.faq);
var s ={lang: lang, url: newobj.url};
newobj['links']=[s];
return newobj;
}
解决方案
支持obj.en
并obj.hi
包含多个对象。
免责声明:此代码未按最初要求输出对象数组。相反,它是一个以“页面”为键的对象。(这使代码更有效率。)如果您需要确切的输出,请查看下面的答案。
var obj={
"en": [{
"faq": "faq",
"about": "about"
}],
"hi": [{
"faq": "aksar-poochhe-jaane-vaale",
"about": "hamaare-baare"
}]
}
function getObj(origLang, obj) {
if (typeof obj !== 'object') { return false; }
let result = {};
Object.keys(obj).forEach((lang) => { // Loop languages
obj[lang].forEach((pages) => {
if (typeof pages !== 'object') { return false; }
Object.keys(pages).forEach((page) => { // Loop pages
const url = pages[page];
// Create array if doesn't exist
if (typeof result[page] == 'undefined') {
result[page] = {'url': '', 'links': []};
}
// If original lang, add the url
if (origLang == lang) { result[page]['url'] = `/${origLang}/${url}`; }
// Add the links
result[page]['links'].push({
'lang': lang,
'url': `/${origLang}/${url}`
});
});
});
});
return result;
}
// Output to console.
console.log('The "en" array');
console.log(getObj('en', obj));
console.log('The "hi" array');
console.log(getObj('hi', obj));
旧版本。更具可读性,但需要循环对象两次。
var obj={
"en": [{
"faq": "faq",
"about": "about"
}],
"hi": [{
"faq": "aksar-poochhe-jaane-vaale",
"about": "hamaare-baare"
}]
}
function getObj(lang, obj){
const target = obj[lang];
let results = [];
target.forEach((pages) => {
if (typeof pages !== 'object') { return false; }
Object.keys(pages).forEach((page) => {
const url = pages[page]; // Get the url
results.push({
'url': "/" + lang + "/" + url,
'links': getLinks(page, obj) // Form the links
});
});
});
return results;
}
function getLinks(page, obj) {
let links = [];
if (typeof obj !== 'object') { return false; }
Object.keys(obj).forEach((lang) => {
obj[lang].forEach((target) => {
links.push({
'lang': lang,
'url': "/" + lang + "/" + target[page]
});
});
});
return links;
}
// Output to console.
console.log('The "en" array');
console.log(getObj('en', obj));
console.log('The "hi" array');
console.log(getObj('hi', obj));
旧的 Javascript:
var obj={
"en": [{
"faq": "faq",
"about": "about"
}],
"hi": [{
"faq": "aksar-poochhe-jaane-vaale",
"about": "hamaare-baare"
}]
}
function getObj(lang, obj){
var target = obj[lang],
results = [];
for (var i = 0; i < target.length; i++) {
var pages = target[i]; // Get the object {"faq": "faq", "about", "about"}
for (var page in pages) {
if (!pages.hasOwnProperty(page)) { continue; }
var url = pages[page]; // Get the url
results.push({
'url': "/" + lang + "/" + url,
'links': getLinks(page, obj) // Form the links
});
}
}
return results;
}
function getLinks(page, obj) {
var links = [];
for (var lang in obj) { // Loop through each language
if (!obj.hasOwnProperty(lang)) { continue; }
var targets = obj[lang];
for (var i=0; i < targets.length; i++) {
var target = targets[i];
links.push({
'lang': lang,
'url': "/" + lang + "/" + target[page]
});
}
}
return links;
}
// Output to console.
console.log('The "en" array');
console.log(getObj('en', obj));
console.log('The "hi" array');
console.log(getObj('hi', obj));
推荐阅读
- android - Fluttter 和 Android 发布模式
- reactjs - React memo prevProps 总是给出初始值,而不是实际的先前道具
- javascript - 'state' 未定义 no-undef
- vue.js - 我使用 npm run dev 为什么找不到 vuejs
- html - 在选择器组合中使用逗号
- python - Plotly Dash 回调输出图形数组到布局中的单个 Div?
- flutter - Flutter 应用中如何从 Twitter 获取用户信息?
- reactjs - 尝试导入错误:'styles' 未从 './styles' 导出
- docker - 本地主机连接内的多个数据库
- html - 使用css webkit动画时,表格边框不会出现在后面的元素上