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