繁体   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