简体   繁体   English

使用多个数组过滤嵌套的JSON对象,并将过滤后的对象存储在数组中

[英]Filter nested JSON object with multiple arrays and store the filtered objects in an array

I want to filter the items array objects which match the "model" key in the models array and store them in an array. 我想过滤与models数组中的“ model”键匹配的items数组对象,并将它们存储在数组中。 I did succeed in my attempt but I am not very satisfied with my effort. 我的尝试确实成功了,但是我对自己的努力并不满意。 Are there any better ways of doing it? 有更好的方法吗?

Any suggestions on how to do it using underscore.js and lodash? 关于如何使用underscore.js和lodash的任何建议? Or using the native javascript map and filter functions? 还是使用本机JavaScript地图和过滤器功能?

The JSON object 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
  }
]
}

My Solution 我的解决方案

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

I would take a slightly different approach. 我会采取略有不同的方法。 I guess you might like it. 我想你可能会喜欢。

  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); 

You could do this: 您可以这样做:

I thought you wanted to add the year from models array too. 我以为您也想从models数组中添加年份。 If so, look at this implementation. 如果是这样,请查看此实现。 This is more efficient O(n) than O(n*n) solution that you attempted earlier. 这是更有效的O(n)O(n*n)早前尝试的解决方案。 For large arrays O(n*n) is not preferred. 对于大数组, 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); 

You can rewrite 你可以重写

let obj = {
  ...items[j],
  year: models[i].year
}

as

let obj = Object.assign({}, items[j], { year: models[i].year });

And you can also use Array.prototype.forEach instead of a for loop, like so 而且您也可以使用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);
    } 
  })
})

I tried to keep it as similar to your solution as possible. 我试图使其尽可能与您的解决方案相似。

Try this snippet: 试试以下代码片段:

 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