Javascript 使用多个数组过滤嵌套的JSON对象,并将过滤后的对象存储在一个数组中
我想筛选与模型数组中的“model”键匹配的items数组对象,并将它们存储在一个数组中。我的尝试确实成功了,但我对自己的努力不是很满意。有没有更好的方法 关于如何使用下划线.js和lodash执行此操作,有什么建议吗?或者使用本机javascript映射和过滤函数 JSON对象Javascript 使用多个数组过滤嵌套的JSON对象,并将过滤后的对象存储在一个数组中,javascript,arrays,json,filter,nested,Javascript,Arrays,Json,Filter,Nested,我想筛选与模型数组中的“model”键匹配的items数组对象,并将它们存储在一个数组中。我的尝试确实成功了,但我对自己的努力不是很满意。有没有更好的方法 关于如何使用下划线.js和lodash执行此操作,有什么建议吗?或者使用本机javascript映射和过滤函数 JSON对象 { "items": [ { "model": "ooc0d", "code": "2x4qr", "price": 33 }, { "model": "ruie9",
{
"items": [
{
"model": "ooc0d",
"code": "2x4qr",
"price": 33
},
{
"model": "ruie9",
"code": "2f6gi",
"price": 22
},
{
"model": "aqu0d",
"code": "2f6gi",
"price": 21
},
{
"model": "ddebd",
"code": "2f6gi",
"price": 25
},
{
"model": "ddebd",
"code": "2f6gi",
"price": 29
}
],
"models": [
{
"model": "ruie9",
"year": 1998
},
{
"model": "ooc0d",
"year": 1991
},
{
"model": "aqu0d",
"year": 1994
},
{
"model": "ddebd",
"year": 1995
},
{
"model": "odq76",
"year": 1999
}
]
}
我的解决方案
const { models, items } = jsonData;
const newarray = [];
for(let i = 0; i < models.length; i++) {
for(let j = 0; j < items.length; j++) {
if(items[j].model===models[i].model) {
let obj = {
...items[j],
year: models[i].year
}
newarray.push(obj);
}
}
}
const{models,items}=jsonData;
常量newarray=[];
for(设i=0;i
您可以重写
let obj = {
...items[j],
year: models[i].year
}
作为
您还可以使用而不是for
循环,如下所示
models.forEach((m) => {
items.forEach((i) => {
if (m.id === i.id) {
let obj = Object.assign({}, i, { year: m.year });
newArray.push(obj);
}
})
})
我试图使它尽可能与您的解决方案相似。请尝试以下代码片段:
const jsonData={
“项目”:[{
“型号”:“ooc0d”,
“代码”:“2x4qr”,
“价格”:33
},
{
“模型”:“ruie9”,
“代码”:“2f6gi”,
“价格”:22
},
{
“型号”:“aqu0d”,
“代码”:“2f6gi”,
“价格”:21
},
{
“模型”:“ddebd”,
“代码”:“2f6gi”,
“价格”:25
},
{
“模型”:“ddebd”,
“代码”:“2f6gi”,
“价格”:29
}
],
“模型”:[{
“模型”:“ruie9”,
“年份”:1998年
},
{
“型号”:“ooc0d”,
“年份”:1991年
},
{
“型号”:“aqu0d”,
“年份”:1994年
},
{
“模型”:“ddebd”,
“年份”:1995年
},
{
“型号”:“odq76”,
“年份”:1999年
}
]
};
var newArray=jsonData.models.reduce(
(acc,modelData)=>{
让filteredItems=jsonData.items.filter(item=>item.model==modelData.model);
if(过滤数据项长度){
acc.push(…过滤器数据);
}
返回acc;
}, [])
log(newArray)代码>我会采取稍微不同的方法。我想你可能会喜欢
const模型=[
{
“模型”:“ruie9”,
“年份”:1998年
},
{
“模型”:“未找到”,
“年份”:1991年
},
{
“型号”:“aqu0d”,
“年份”:1994年
},
{
“模型”:“ddebd”,
“年份”:1995年
},
{
“型号”:“odq76”,
“年份”:1999年
}
];
常数项=[
{
“型号”:“ooc0d”,
“代码”:“2x4qr”,
“价格”:33
},
{
“模型”:“ruie9”,
“代码”:“2f6gi”,
“价格”:22
},
{
“型号”:“aqu0d”,
“代码”:“2f6gi”,
“价格”:21
},
{
“模型”:“ddebd”,
“代码”:“2f6gi”,
“价格”:25
},
{
“模型”:“ddebd”,
“代码”:“2f6gi”,
“价格”:29
}
];
const transformed=models.reduce((res,val)=>{
res[val.model]=val;
返回res;
}, {}); // 将模型转换为字典。
const filtered=items.filter(转换后的i=>i.model);
console.log(过滤)代码>您可以这样做:
我还以为你想从模型
数组中添加年份。
如果是这样,请查看此实现。这比您先前尝试的O(n)
解决方案效率更高。对于大型阵列O(n*n)
不是首选
let项目=[{
“型号”:“ooc0d”,
“代码”:“2x4qr”,
“价格”:33
},
{
“模型”:“ruie9”,
“代码”:“2f6gi”,
“价格”:22
},
{
“型号”:“aqu0d”,
“代码”:“2f6gi”,
“价格”:21
},
{
“模型”:“ddebd”,
“代码”:“2f6gi”,
“价格”:25
},
{
“模型”:“ddebd”,
“代码”:“2f6gi”,
“价格”:29
}
];
让模型=[
{
“模型”:“ruie9”,
“年份”:1998年
},
{
“型号”:“ooc0d”,
“年份”:1991年
},
{
“型号”:“aqu0d”,
“年份”:1994年
}
];
让objModels=models.reduce(函数(r,v){
r[v.model]=v;
返回r;
}, {});
让objItems=items.reduce(函数(r,v){
r[v.model]=v;
返回r;
}, {});
设ans=[];
for(让输入对象){
if(输入objModels){
设o=objItems[key];
o、 年份=对象模型[key]。年份;
ans.push(o);
}
}
控制台日志(ans)
在您的代码中,您可以访问id
属性,但在您的JSONOops中没有id属性的跟踪,很抱歉。只是corrected@created这是我的乌米尔和潘卡吉。Pankaj赢了:)谢谢男士:)我可以知道[]
在reduce函数的末尾做了什么吗?这是一个更干净的解决方案,但是你在每次迭代中都会运行过滤器
,IMO非常详尽。@1033总是受欢迎的[]
是acc
的初始值,如果您忽略它,它是可选的,那么acc
的第一个值将是jsonData.models的第一个元素。models
@Umair Interest,但我有意使用filter,因为每个模型都与项目有1对多的关系,所以每个模型都可以有多个项目链接到它,这就是为什么我会在每个模型上过滤这些项目。如果您有更好的建议,请随意编辑或添加您的变体。@KarenGrigoryan我完全理解您使用的过滤器
,我并没有说它是错的。请用我喜欢的方法检查我的答案,也请分享你的想法。@1033很高兴我能提供帮助。此外,使用这种方法,你只需在模型列表中循环一次,而不是在每次迭代中循环。@KarenGrigoryan很有趣:)太好了!你能解释一下我的解决方案的复杂性是怎样的吗?@Umair我什么时候说过你的是O(n*n)
?这是为OP设计的。然而,你的设计甚至不是OP想要的解决方案。他想把year
也附上。查看OP尝试的第y行解决方案
models.forEach((m) => {
items.forEach((i) => {
if (m.id === i.id) {
let obj = Object.assign({}, i, { year: m.year });
newArray.push(obj);
}
})
})