使用多个数组过滤嵌套的JSON对象并将过滤的对象存储在数组中
我想过滤与models数组中的“model”键匹配的items数组对象,并将它们存储在数组中。我的努力取得了成功,但我对我的努力并不满意。有没有更好的方法来做到这一点?使用多个数组过滤嵌套的JSON对象并将过滤的对象存储在数组中
有关如何使用underscore.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);
}
}
}
可以重写
let obj = {
...items[j],
year: models[i].year
}
为
let obj = Object.assign({}, items[j], { year: models[i].year });
而且你还可以使用Array.prototype.forEach
代替for
循环,像这样
models.forEach((m) => {
items.forEach((i) => {
if (m.id === i.id) {
let obj = Object.assign({}, i, { year: m.year });
newArray.push(obj);
}
})
})
我试图保持它类似于您的解决方案成为可能。
谢谢你!它看起来更干净:D – 1033
试试这个片断:
const jsonData = {
"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
}
]
};
var newArray = jsonData.models.reduce(
(acc, modelData) => {
let filteredItems = jsonData.items.filter(item => item.model === modelData.model);
if (filteredItems.length) {
acc.push(...filteredItems);
}
return acc;
}, [])
console.log(newArray);
我将采取略有不同的方法。我想你可能会喜欢它。
const models = [
{
"model": "ruie9",
"year": 1998
},
{
"model": "not-found",
"year": 1991
},
{
"model": "aqu0d",
"year": 1994
},
{
"model": "ddebd",
"year": 1995
},
{
"model": "odq76",
"year": 1999
}
];
const 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
}
];
const transformed = models.reduce((res, val) => {
res[val.model] = val;
return res;
}, {}); // Transform models into a dictionary.
const filtered = items.filter(i => i.model in transformed);
console.log(filtered);
你可以这样做:
我想你想从models
阵列添加今年也。 如果是这样,看看这个实现。这比您之前尝试的解决方案更有效率O(n)
比O(n*n)
更有效。对于大型阵列O(n*n)
不是优选的。
let 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
}
];
let models = [
{
"model": "ruie9",
"year": 1998
},
{
"model": "ooc0d",
"year": 1991
},
{
"model": "aqu0d",
"year": 1994
}
];
let objModels = models.reduce(function(r,v) {
r[v.model] = v;
return r;
}, {});
let objItems = items.reduce(function(r,v) {
r[v.model] = v;
return r;
}, {});
let ans = [];
for(let key in objItems) {
if(key in objModels) {
let o = objItems[key];
o.year = objModels[key].year;
ans.push(o);
}
}
console.log(ans);
你[赢](https://jsfiddle.net/sf5jtru6/)恭喜。 –
太棒了!你能解释我的解决方案的复杂性是“O(n * n)”吗? – Umair
@Umair我什么时候说你是'O(n * n)'?这是给OP的。但是,你的解决方案甚至不是OP所需要的。他也想要“年”。看看OP的'year:models [i] .year'的尝试解决方案。 –
您访问'id'财产,但有你的JSON – quirimmo
不跟踪id属性哎呀对不起。刚刚纠正 – 1033
@创建了这个[基准](https://jsfiddle.net/sf5jtru6/)与我Umair和Pankaj。 Pankaj获胜:) –