【问题标题】:How to use map to get an array of objects from a parent array of objects如何使用 map 从对象的父数组中获取对象数组
【发布时间】:2023-02-26 09:50:01
【问题描述】:

你好,

我有这段代码:

   var itemsdata = [
     {"id":"item1", "assets":[{"id":"size","value":1},{"id":"age","value":14}]},
     {"id":"item2", "assets":[{"id":"size","value":1}]},
     {"id":"item13", "assets":[{"id":"size","value":1}]}
    ];

var itemid = 'item1';

var itemassets = itemsdata.map(d => d.id === itemid ? d.assets : '');

console.log(itemassets); //expected output: [{"id":"size","value":1},{"id":"age","value":14}]

我不能用这个得到预期的输出。我尝试了变体但没有用。正确的做法是什么?

谢谢。

【问题讨论】:

  • 您的代码很好,您可以删除地图内的 else 条件 -> d.assets : '' 以获得所需的结果。
  • 如果我这样做,我会得到一个错误。
  • 没有用if( )
  • 你能发布完整的代码吗?
  • 我已经发布了,如果我正确理解了你的问题,请告诉我。

标签: javascript arrays


【解决方案1】:

您的代码很好,您只需要删除 else 案例。

var itemsdata = [
  {"id":"item1", "assets":[{"id":"size","value":1},{"id":"age","value":14}]},
  {"id":"item2", "assets":[{"id":"size","value":1}]},
  {"id":"item13", "assets":[{"id":"size","value":1}]}
 ];

var itemid = 'item1';
var itemassets;
itemsdata.map((e)=>{
  if(e.id===itemid){
    itemassets = e.assets
  }
})

console.log(itemassets);

【讨论】:

  • 好的,我现在明白了。这也是一个很好的方法。谢谢。
  • map 是用于此的错误方法。 map 的回调应该返回一个转换后的元素。你最好使用 forEach 甚至 for...of 循环。
【解决方案2】:

可以用filter filter out the empty strings来过滤掉空字符串:

var itemassets = itemsdata.map(d => d.id === itemid ? d.assets : '').filter(d => d !== '');

完整示例(使用 null 而不是空字符串):

var itemsdata = [{ "id": "item1", "assets": [{ "id": "size", "value": 1 }, { "id": "age", "value": 14 }] }, { "id": "item2", "assets": [{ "id": "size", "value": 1 }] }, { "id": "item13", "assets": [{ "id": "size", "value": 1 }] } ];
var itemid = 'item1';

var itemassets = itemsdata.filter(d => d.id === itemid).map(d => d.assets);

console.log(itemassets[0]); //expected output: [{"id":"size","value":1},{"id":"age","value":14}]

第一个 filter 遍历你的数组并只返回匹配的项目,然后地图返回所需的 assets 属性。

这将产生一个数组数组,你只需要打印它的第一项。


或者作为一种不同的方法:

var itemsdata = [{ "id": "item1", "assets": [{ "id": "size", "value": 1 }, { "id": "age", "value": 14 }] }, { "id": "item2", "assets": [{ "id": "size", "value": 1 }] }, { "id": "item13", "assets": [{ "id": "size", "value": 1 }] }, { "id": "item99", "assets": [] } ];

var itemid = 'item1';

var itemassets = itemsdata.filter(d => d.id === itemid && d.assets).reduce((acc, d) => [...acc, ...d.assets], []);

console.log(itemassets); //expected output: [{"id":"size","value":1},{"id":"age","value":14}]

使用reduce,您可以将结果合并到一个数组中

【讨论】:

  • 谢谢,减少是我一直在寻找的。就一件事。如果该项目恰好在资产中有 null 让我们说 {"id":"item8", "assets":null} 我得到一个错误。我该如何解决?
  • 我用itemsdata.filter(d => d.id === itemid && d.assets).reduce((acc, d) => [...acc, ...d.assets], []);更新了我的第二个例子,&& d.assets的部分意味着d.assets是真实的:不是空的,也不是空数组
【解决方案3】:

map 将调用函数全部数组元素。如果 id 是唯一的,您很可能需要 find 遍历数组,直到它找到一个具有与您的查询匹配的 id 的对象,并返回其 assets 数组。

如果找到对象,此函数将返回资产数组,如果assetsnull,则返回一条消息,指出该对象没有资产,如果数组中不存在,则返回一条消息,表示找不到该对象。

const arr=[{id:"item1",assets:[{id:"size",value:1},{id:"age",value:14}]},{id:"item2",assets:[{id:"size",value:1}]},{id:"item13",assets:[{id:"size",value:1}]},{"id":"item8", "assets":null}];

function assetsById(arr, query) {
  const found = arr.find(obj => obj.id === query);
  if (found) return found.assets || 'No assets';
  return 'Object not found';
}

console.log(assetsById(arr, 'item1'));
console.log(assetsById(arr, 'item5'));
console.log(assetsById(arr, 'item8'));

【讨论】:

    【解决方案4】:

    一种方法是使用Array.prototype.forEach()

    let itemassets = []
    itemsdata.forEach(d => {
        if(d.id === itemid && d.assets) {
            d.assets.forEach(a =>{
                itemassets.push(a)
            })
        } ; 
    })
    console.log(itemassets)
    

    【讨论】:

      【解决方案5】:

      您也可以使用“filter(...)”来获得类似的结果...

      var itemsdata = [
          {"id":"item1", "assets":[{"id":"size","value":1},{"id":"age","value":14}]},
          {"id":"item2", "assets":[{"id":"size","value":1}]},
          {"id":"item3", "assets":[{"id":"size","value":1}]}
      ];
      
      var itemid = 'item1';
      
      let [ itemassets ] = itemsdata.filter(i => i.id === itemid);
      
      // if the data do not exist will return undefined
      itemassets = itemassets?.assets;
      
      // result [ { id: 'size', value: 1 }, { id: 'age', value: 14 } ];
      console.log(itemassets);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 2016-01-23
        • 2019-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        相关资源
        最近更新 更多