Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 使用多个数组过滤嵌套的JSON对象,并将过滤后的对象存储在一个数组中_Javascript_Arrays_Json_Filter_Nested - Fatal编程技术网

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",

我想筛选与模型数组中的“model”键匹配的items数组对象,并将它们存储在一个数组中。我的尝试确实成功了,但我对自己的努力不是很满意。有没有更好的方法

关于如何使用下划线.js和lodash执行此操作,有什么建议吗?或者使用本机javascript映射和过滤函数

JSON对象

 {
"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);
    } 
  })
})