簡體   English   中英

使用多個數組過濾嵌套的JSON對象,並將過濾后的對象存儲在數組中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM