我有一个名为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;
}
答案 0 :(得分:3)
支持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));
答案 1 :(得分:-1)
return
只能返回一个值;您期望返回的值是一个列表,不包含任何内容。到目前为止,这还不是问题,因为还没有任何逻辑可用于处理lang的后续值(尚未明确传递)。
所以您需要做两件事:
您已经具有用于构建基本嵌套对象的工作功能,您只需要一种方法来处理其他情况。以下内容应处理一种或多种语言;但是,如果未传递有效的lang,则会过早返回:
var obj = {
"en": [{
"faq": "faq",
"about": "about"
}],
"hi": [{
"faq": "aksar-poochhe-jaane-vaale",
"about": "hamaare-baare"
}]
}
function getOtherKeys(lang, obj) {
return Object.keys(obj).filter(key => key != lang)
}
// Repurposed your function
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];
// my changes below to handle other links
var keys = getOtherKeys(lang, obj);
for (var key of keys) {
newobj['links'].push({
lang: key,
url: "/" + key + "/" + obj[key].map(e => e.faq)
})
}
return newobj;
}
// Wrapping your code in an array and handling zeroeth/other keys
function buildObj(lang, obj) {
var outerObj = [];
// remove the zeroth key
var otherKeys = getOtherKeys(lang, obj);
// Add the primary language
if (obj[lang]) {
outerObj.push(getObj(lang, obj));
} else {
return;
}
// Add all other languages
for (var key of otherKeys) {
outerObj.push(getObj(key, obj));
}
return outerObj;
}
var obj = {
"en": [{
"faq": "faq",
"about": "about"
}],
"hi": [{
"faq": "aksar-poochhe-jaane-vaale",
"about": "hamaare-baare"
}]
}
var en = buildObj("en", obj); // Call array wrapper
console.log(en);
var hi = buildObj("hi", obj);
console.log(hi);