[英]Filter nested array inside different objects and return object with new filtered array
[英]Filter nested JSON object with multiple arrays and store the filtered objects in an array
我想過濾與models數組中的“ model”鍵匹配的items數組對象,並將它們存儲在數組中。 我的嘗試確實成功了,但是我對自己的努力並不滿意。 有更好的方法嗎?
關於如何使用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);
}
}
}
我會采取略有不同的方法。 我想你可能會喜歡。
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);
你可以重寫
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);
}
})
})
我試圖使其盡可能與您的解決方案相似。
試試以下代碼片段:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.