Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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_Json_Angular_Angular4 Forms - Fatal编程技术网

Javascript 基于一个数组对象键和其他数组对象值再创建一个新数组?

Javascript 基于一个数组对象键和其他数组对象值再创建一个新数组?,javascript,arrays,json,angular,angular4-forms,Javascript,Arrays,Json,Angular,Angular4 Forms,我有两个这样的数组 arr1 = [ { 'name':'Victoria Cantrell', 'position':'Integer Corporation', 'office':'Croatia', 'ext':'0839', 'startDate':'2015-08-19', 'salary':208.178 }, { 'name':'Pearleeee',

我有两个这样的数组

    arr1 = [  
   {  
      'name':'Victoria Cantrell',
      'position':'Integer Corporation',
      'office':'Croatia',
      'ext':'0839',
      'startDate':'2015-08-19',
      'salary':208.178
   },
   {  
      'name':'Pearleeee',
      'position':'In PC',
      'office':'Cambodia',
      'ext':'8262',
      'startDate':'2014-10-08',
      'salary':114.367
   },
   {  
      'name':'Pearl Crosby',
      'position':'Integer',
      'office':'Cambodia',
      'ext':'8162',
      'startDate':'2014-10-08',
      'salary':114.367
   }
]

arr2 = 

[{
  'name': 'name',
  'checkfilter': false
},
{
  'name': 'position',
  'checkfilter': true
},
{
  'name': 'office',
  'checkfilter': true
},
{
  'name': 'startDate',
  'checkfilter': false
},
{
  'name': 'ext',
  'checkfilter': false
},
{
  'name': 'salary',
  'checkfilter': false
}]
基于checkfilter==true,我希望生成第三个这样的数组

    arr1 = [  
   {  
      'name':'Victoria Cantrell',
      'position':'Integer Corporation',
      'office':'Croatia',
      'ext':'0839',
      'startDate':'2015-08-19',
      'salary':208.178
   },
   {  
      'name':'Pearleeee',
      'position':'In PC',
      'office':'Cambodia',
      'ext':'8262',
      'startDate':'2014-10-08',
      'salary':114.367
   },
   {  
      'name':'Pearl Crosby',
      'position':'Integer',
      'office':'Cambodia',
      'ext':'8162',
      'startDate':'2014-10-08',
      'salary':114.367
   }
]

arr2 = 

[{
  'name': 'name',
  'checkfilter': false
},
{
  'name': 'position',
  'checkfilter': true
},
{
  'name': 'office',
  'checkfilter': true
},
{
  'name': 'startDate',
  'checkfilter': false
},
{
  'name': 'ext',
  'checkfilter': false
},
{
  'name': 'salary',
  'checkfilter': false
}]
arr3=`

[{
  name: 'position',
  values: [{
    checkName: 'Integer Corporation'

  },
  {
    checkName: 'In PC'

  },
  {
    checkName: 'Integer'

  }]
},

{ 
 name:'office',
  values: [{
    checkName: 'Croatia'

  },
  {
    checkName: 'Cambodia'

  }]
}
]
` 我试图像这样解决这个问题,但效果并不完美

    arr3=[]
      this.arr2.forEach((column: any) => {
      if (column.ischeckFilter === true) {
        this.arr3.push({
          name: column.name,
          values: []
        });
      }
    });

 this.arr1.forEach((d: any) => {
      this.arr2.forEach((column: any) => {
        if (column.ischeckFilter === true) {
        this.arr3.forEach((c: any) => {
         // console.log(d[column.name], c.name, 'JJJJ');
         // console.log(Object.keys(d), 'BBBBBBBBB');
          let keys = Object.keys(d);
          keys.forEach((k: any) => {
            if (k === c.name) {
              if (find( c.values, { 'checkName': d[column.name]}) === undefined) {
                c.values.push({
                  checkName: d[column.name] ,
                  ischeck: false
                });
              }

            }
          });

      });
    }
      });
    });
    console.log( this.arr3)
  }
输出数组值不应包含任何重复项,我用于每个循环,是否有任何最佳做法来解决此情况,如减少循环,因为上面的数组长度非常大,如果我使用更多循环,则会增加加载时间,因此请让我知道如何巧妙地解决此问题


提前感谢

首先让我们过滤arr2

var x = arr2.filter((r) => r.checkfilter).
我们的名字被映射

map((r) => ({name:r.name, 
获取匹配值,并删除重复项

values:([...new Set(arr1.map((x) => (x[r.name])))]).
最后重新映射,我们得到
{checkName:?}

map((r) => ({checkName:r}))
别忘了关上括号和东西

}));
const arr1=[
{  
“姓名”:“维多利亚·坎特雷尔”,
'职位':'Integer Corporation',
“办公室”:“克罗地亚”,
“分机”:“0839”,
“开始日期”:“2015-08-19”,
“工资”:208.178
},
{  
'姓名':'Pearleee',
“位置”:“在PC中”,
“办公室”:“柬埔寨”,
“分机”:“8262”,
“开始日期”:“2014-10-08”,
“工资”:114.367
},
{  
“姓名”:“珀尔·克罗斯比”,
'位置':'整数',
“办公室”:“柬埔寨”,
“分机”:“8162”,
“开始日期”:“2014-10-08”,
“工资”:114.367
}
];
常数arr2=
[{
'name':'name',
“检查筛选器”:false
},
{
“名称”:“位置”,
“checkfilter”:true
},
{
'姓名':'办公室',
“checkfilter”:true
},
{
“名称”:“开始日期”,
“检查筛选器”:false
},
{
'name':'ext',
“检查筛选器”:false
},
{
“姓名”:“工资”,
“检查筛选器”:false
}];
var x=arr2.filter((r)=>r.checkfilter)。
map((r)=>({name:r.name,
值:([…新集合(arr1.map((x)=>(x[r.name]))]))。
map((r)=>({checkName:r}))
}));

控制台日志(x)首先让我们过滤arr2

var x = arr2.filter((r) => r.checkfilter).
我们的名字被映射

map((r) => ({name:r.name, 
获取匹配值,并删除重复项

values:([...new Set(arr1.map((x) => (x[r.name])))]).
最后重新映射,我们得到
{checkName:?}

map((r) => ({checkName:r}))
别忘了关上括号和东西

}));
const arr1=[
{  
“姓名”:“维多利亚·坎特雷尔”,
'职位':'Integer Corporation',
“办公室”:“克罗地亚”,
“分机”:“0839”,
“开始日期”:“2015-08-19”,
“工资”:208.178
},
{  
'姓名':'Pearleee',
“位置”:“在PC中”,
“办公室”:“柬埔寨”,
“分机”:“8262”,
“开始日期”:“2014-10-08”,
“工资”:114.367
},
{  
“姓名”:“珀尔·克罗斯比”,
'位置':'整数',
“办公室”:“柬埔寨”,
“分机”:“8162”,
“开始日期”:“2014-10-08”,
“工资”:114.367
}
];
常数arr2=
[{
'name':'name',
“检查筛选器”:false
},
{
“名称”:“位置”,
“checkfilter”:true
},
{
'姓名':'办公室',
“checkfilter”:true
},
{
“名称”:“开始日期”,
“检查筛选器”:false
},
{
'name':'ext',
“检查筛选器”:false
},
{
“姓名”:“工资”,
“检查筛选器”:false
}];
var x=arr2.filter((r)=>r.checkfilter)。
map((r)=>({name:r.name,
值:([…新集合(arr1.map((x)=>(x[r.name]))]))。
map((r)=>({checkName:r}))
}));

控制台日志(x)使用标准的
映射
过滤器
减少
非常容易:

var arr1=[{
“姓名”:“维多利亚·坎特雷尔”,
'职位':'Integer Corporation',
“办公室”:“克罗地亚”,
“分机”:“0839”,
“开始日期”:“2015-08-19”,
“工资”:208.178
}, {  
'姓名':'Pearleee',
“位置”:“在PC中”,
“办公室”:“柬埔寨”,
“分机”:“8262”,
“开始日期”:“2014-10-08”,
“工资”:114.367
}, {  
“姓名”:“珀尔·克罗斯比”,
'位置':'整数',
“办公室”:“柬埔寨”,
“分机”:“8162”,
“开始日期”:“2014-10-08”,
“工资”:114.367
}];
常数arr2=[{
'name':'name',
“检查筛选器”:false
},{
“名称”:“位置”,
“checkfilter”:true
},{
'姓名':'办公室',
“checkfilter”:true
},{
“名称”:“开始日期”,
“检查筛选器”:false
},{
'name':'ext',
“检查筛选器”:false
},{
“姓名”:“工资”,
“检查筛选器”:false
}];
常量isDuplicate=(arr,name)=>!arr.find(({checkname})=>checkname==name);
常数arr3=arr2
.filter(({checkfilter})=>checkfilter)
.map({name})=>({
姓名:姓名,,
值:arr1.reduce((名称,项)=>isDuplicate(名称,项[name])?
[…名称,{checkname:item[name]}]:名称,[])
}));

控制台日志(arr3)使用标准的
映射
过滤器
减少
非常容易:

var arr1=[{
“姓名”:“维多利亚·坎特雷尔”,
'职位':'Integer Corporation',
“办公室”:“克罗地亚”,
“分机”:“0839”,
“开始日期”:“2015-08-19”,
“工资”:208.178
}, {  
'姓名':'Pearleee',
“位置”:“在PC中”,
“办公室”:“柬埔寨”,
“分机”:“8262”,
“开始日期”:“2014-10-08”,
“工资”:114.367
}, {  
“姓名”:“珀尔·克罗斯比”,
'位置':'整数',
“办公室”:“柬埔寨”,
“分机”:“8162”,
“开始日期”:“2014-10-08”,
“工资”:114.367
}];
常数arr2=[{
'name':'name',
“检查筛选器”:false
},{
“名称”:“位置”,
“checkfilter”:true
},{
'姓名':'办公室',
“checkfilter”:true
},{
“名称”:“开始日期”,
“检查筛选器”:false
},{
'name':'ext',
“检查筛选器”:false
},{
“姓名”:“工资”,
“检查筛选器”:false
}];
常量isDuplicate=(arr,name)=>!arr.find(({checkname})=>checkname==name);
常数arr3=arr2
.filter(({checkfilter})=>checkfilter)
.map({name})=>({
姓名:姓名,,
值:arr1.reduce((名称,项)=>isDuplicate(名称,项[name])?
[…名称,{checkname:item[name]}]:名称,[])
}));
控制台日志(arr3)
函数createArr3(目标,源){
for(源中的var prop){
如果(源[prop][“checkfilter”]){
var newArr3Element={};
newArr3Element.name=源[prop].name;
newArr3Element.values=[];
target.forEach(函数(元素){
if(newArr3Element.values.indexOf)(元素[source[pro