Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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是通过Id链接的两个选项卡构建对象的最有效方法_Javascript_Arrays_List_Object - Fatal编程技术网

Javascript是通过Id链接的两个选项卡构建对象的最有效方法

Javascript是通过Id链接的两个选项卡构建对象的最有效方法,javascript,arrays,list,object,Javascript,Arrays,List,Object,我从一个API接收到一个带有2个列表的json 在第一个列表中,有具有以下属性的对象:id、名称、类型、标签 对于第二个列表中的对象,属性为:id、名称、顺序。 第二个列表的id指第一个列表的id,可以有多个对象指第一个列表中的单个对象(多对一),但也可能没有(零对一) 我想创建一个具有以下属性的对象:id、名称、类型、标签、选项卡。其中选项卡将包含第二个列表中引用第一个列表的所有对象 最有效的方法是什么 阵列示例: 第一阵列: {id : 1, name: 'colors', type: 'l

我从一个API接收到一个带有2个列表的json

在第一个列表中,有具有以下属性的对象:id、名称、类型、标签

对于第二个列表中的对象,属性为:id、名称、顺序。 第二个列表的id指第一个列表的id,可以有多个对象指第一个列表中的单个对象(多对一),但也可能没有(零对一)

我想创建一个具有以下属性的对象:id、名称、类型、标签、选项卡。其中选项卡将包含第二个列表中引用第一个列表的所有对象

最有效的方法是什么

阵列示例:

第一阵列:

{id : 1, name: 'colors', type: 'list', label:'xxx'},
{id : 2, name: 'yyy', type: 'date', label:'yyy'},
{id : 3, name: 'dogs', type: 'list', label:'zzz'}
第二阵列:

{id:1, name:'blue', order:1},
{id:1, name:'red', order:2},
{id:1, name:'green', order:3},
{id:3, name:'husky', order:1},
{id:3, name:'bulldog', order:2},
{id:3, name:'dalmatian', order:3}
通缉结果:

{id : 1, name: 'colors', type: 'list', label:'xxx', options: [
    {id: 1, name:'blue', order:1},
    {id: 1, name:'red', order:2},
    {id: 1, name:'green', order:3}]},
{id : 2, name: 'yyy', type: 'date', label:'yyy', tab: []},
{id : 3, name: 'dogs', type: 'list', label:'zzz', options: [
    {id: 3, name:'husky', order:1},
    {id: 3, name:'bulldog', order:2},
    {id: 3, name:'dalmatian', order:3}
]}
试试这个

var m = {};
var arr1 = [{id : 1, name: 'colors', type: 'list', label:'xxx'},
            {id : 2, name: 'yyy', type: 'date', label:'yyy'},
            {id : 3, name: 'dogs', type: 'list', label:'zzz'}];
var arr2 = [{id:1, name:'blue', order:1},
            {id:1, name:'red', order:2},
            {id:1, name:'green', order:3},
            {id:3, name:'husky', order:1},
            {id:3, name:'bulldog', order:2},
            {id:3, name:'dalmatian', order:3}];
for(var i=0;i<arr1.length;i++){
    arr1[i]["options"] = [];
    m[arr1[i]["id"]] = arr1[i];
}
for(var i=0;i<arr2.length;i++){
    if(m.hasOwnProperty(arr2[i]["id"])){
        m[arr2[i]["id"]]["options"].push(arr2[i]);
    }
}
console.log(arr1);
var m={};
var arr1=[{id:1,名称:'colors',类型:'list',标签:'xxx'},
{id:2,名称:'yyy',类型:'date',标签:'yyy'},
{id:3,名称:'dogs',类型:'list',标签:'zzz'}];
var arr2=[{id:1,名称:'blue',顺序:1},
{id:1,名称:'red',顺序:2},
{id:1,名称:'green',顺序:3},
{id:3,姓名:'husky',顺序:1},
{id:3,名字:'bulldog',顺序:2},
{id:3,名称:'dalmatian',顺序:3}];

对于(var i=0;i请添加2个数组的样本首先,当您考虑最有效的方法时,最好从API本身获取整合数据。这样可以减少两个不同rest调用的网络时间。这取决于大小。如果第二个列表很小,您可以将其转换为对象映射索引w使用id,然后在第一个列表上运行map,按id从该对象映射请求对象。如果第二个较大,则可以执行一些记忆功能,从中检索数据。如果可以在服务器端执行,则会更好…@adiga我添加了示例。@SaiKarthik我无法更改API,我希望我可以。我编辑了我的问题,以便您可以看到我所做的期望作为输出。我认为您给出的解决方案只会将两者合并。
var m = {};
var arr1 = [{id : 1, name: 'colors', type: 'list', label:'xxx'},
            {id : 2, name: 'yyy', type: 'date', label:'yyy'},
            {id : 3, name: 'dogs', type: 'list', label:'zzz'}];
var arr2 = [{id:1, name:'blue', order:1},
            {id:1, name:'red', order:2},
            {id:1, name:'green', order:3},
            {id:3, name:'husky', order:1},
            {id:3, name:'bulldog', order:2},
            {id:3, name:'dalmatian', order:3}];
for(var i=0;i<arr1.length;i++){
    arr1[i]["options"] = [];
    m[arr1[i]["id"]] = arr1[i];
}
for(var i=0;i<arr2.length;i++){
    if(m.hasOwnProperty(arr2[i]["id"])){
        m[arr2[i]["id"]]["options"].push(arr2[i]);
    }
}
console.log(arr1);