Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从包含阵列属性的基础对象选择性地创建新的对象阵列_Javascript_Arrays_Object_Ecmascript 6 - Fatal编程技术网

Javascript 从包含阵列属性的基础对象选择性地创建新的对象阵列

Javascript 从包含阵列属性的基础对象选择性地创建新的对象阵列,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,我有一个名为obj的对象,它将作为创建特定格式的新对象数组的基础 我的基本对象: var obj={ "en": [{ "faq": "faq", "about": "about" }], "hi": [{ "faq": "aksar-poochhe-jaane-vaale", "about": "hamaare-baare" }] } 我创建了一个函数getObj(),它接受两个参数lang和基本对象obj 示例场景 当我打电

我有一个名为obj的对象,它将作为创建特定格式的新对象数组的基础

我的基本对象:

var obj={
  "en": [{
    "faq": "faq",
    "about": "about"
    }],
  "hi": [{
    "faq": "aksar-poochhe-jaane-vaale",
    "about": "hamaare-baare"
    }]    
}
我创建了一个函数
getObj()
,它接受两个参数
lang
和基本对象
obj


示例场景

当我打电话时:

getObj("en", obj);
getObj("hi", 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' }
   ]
 }]
 [{
  "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' }
   ]
 }]
当我打电话时:

getObj("en", obj);
getObj("hi", 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' }
   ]
 }]
 [{
  "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”:[{
“常见问题”:“常见问题”,
“关于”:“关于”
}],
“你好”:[{
“常见问题解答”:“aksar Pooche jaane vaale”,
“关于”:“哈马雷·巴雷”
}]    
}
函数getObj(origLang,obj){
if(typeof obj!=='object'){return false;}
让结果={};
Object.keys(obj).forEach((lang)=>{//循环语言
obj[lang].forEach((页)=>{
如果(页面类型!=='object'){返回false;}
Object.keys(pages).forEach((page)=>{//循环页面
const url=页面[页面];
//如果不存在,则创建数组
如果(结果的类型[页面]=“未定义”){
结果[页面]={'url':'','links':[]};
}
//如果是原始语言,请添加url
如果(origLang==lang){result[page]['url']=`/${origLang}/${url}`;}
//添加链接
结果[页面]['links']。推送({
“郎”:郎,
'url':`/${origLang}/${url}`
});
});
});
});
返回结果;
}
//输出到控制台。
log(“en”数组);
console.log(getObj('en',obj));
log(“hi”数组);

console.log(getObj('hi',obj))
返回
只能返回一个值;您期望返回的值是一个列表,不包含任何内容。这还不是一个问题,因为对于如何处理lang的后续值(尚未显式传递)没有任何逻辑

所以你需要做两件事:

  • 查找未用于构建第一个对象的lang键,并对其进行迭代以构建列表中的后续项
  • 通过在数据结构中包含列表来传递单个对象。因为您使用的是JS,所以我建议您使用数组
  • 您已经有了一个用于构建基本嵌套对象的工作函数,您只需要一种方法来处理其他情况。以下内容应处理一种或多种语言;但如果未传递有效的lang,它将过早返回:

    var obj={
    “en”:[{
    “常见问题”:“常见问题”,
    “关于”:“关于”
    }],
    “你好”:[{
    “常见问题解答”:“aksar Pooche jaane vaale”,
    “关于”:“哈马雷·巴雷”
    }]
    }
    函数getOtherKeys(lang、obj){
    返回Object.keys(obj.filter)(key=>key!=lang)
    }
    //重新调整了你的职能
    函数getObj(lang,obj){
    var newobj={};
    newobj['url']=“/”+lang+“/”+obj[lang].map(e=>e.faq);
    变量s={
    朗:朗,
    url:newobj.url
    };
    newobj['links']=[s];
    //我在下面的更改处理其他链接
    var key=getotherkey(lang,obj);
    for(键的变量键){
    newobj['links'].push({
    朗:关键,
    url:“/”+key+“/”+obj[key].map(e=>e.faq)
    })
    }
    返回newobj;
    }
    //将代码包装在数组中并处理零/其他键
    函数buildObj(lang,obj){
    var outerObj=[];
    //移除第0个键
    var otherKeys=getOtherKeys(lang,obj);
    //添加主语言
    if(obj[lang]){
    外推(getObj(lang,obj));
    }否则{
    返回;
    }
    //添加所有其他语言
    for(其他键的var键){
    outerObj.push(getObj(键,obj));
    }
    返回ROBJ;
    }
    var obj={
    “en”:[{
    “常见问题”:“常见问题”,
    “关于”:“关于”
    }],
    “你好”:[{
    “常见问题解答”:“aksar Pooche jaane vaale”,
    “关于”:“哈马雷·巴雷”
    }]
    }
    var en=buildObj(“en”,obj);//调用数组包装器
    控制台日志(en);
    var hi=buildObj(“hi”,obj);
    
    控制台日志(hi)
    对象en或对象hi应该是数组吗?它是否包含多个对象?因为在您的示例中,尽管它是一个数组,但它只有一个。请花时间理解上面的代码。如果你有任何问题,我有答案。(虽然可能不是一个好的;)它的工作原理是忽略每个数组中除第一个元素外的所有元素。。。我认为现在回答还为时过早。输出与帖子不相似