ES6 - 在嵌套数组中查找数据

新手上路,请多包涵

在 ES6 中使用 findfilter 我很乐意使用一个值遍历数组中的元素。

但是,我试图根据嵌套数组中的值从父数组中获取值。

例如,在这个数据结构中:

 products: [
  {
    id: 01,
    items: [
      {
        id: 01,
        name: 'apple'
      },
      {
        id: 02,
        name: 'banana'
      },
      {
        id: 03,
        name: 'orange'
      }
    ]
  },
  {
    id: 02,
    items: [
      {
        id: 01,
        name: 'carrot'
      },
      {
        id: 02,
        name: 'lettuce'
      },
      {
        id: 03,
        name: 'peas'
      }
    ]
  },
  {
    id: 03,
    items: [
      {
        id: 01,
        name: 'eggs'
      },
      {
        id: 02,
        name: 'bread'
      },
      {
        id: 03,
        name: 'milk'
      }
    ]
  }
]

如果我知道 nameid 对象 milk ,有没有办法找出它嵌套在元素的 id 中?

目前我有这个:

 products.find((product) => {
  product.find((prod) => {
    return prod.name === 'milk';
  });
});

它只返回包含 milk 的对象。

原文由 Toby 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

您必须从外部 find 的回调中返回一些东西。事实上,对于内部迭代,你不应该使用 find 而是 some 返回一个布尔值来判断数组中是否存在与条件匹配的元素:

 products.find((product) => {
  return product.items.some((item) => {
//^^^^^^
    return item.name === 'milk';
  });
});

或简而言之:

 products.find(product => product.items.some(item => item.name === 'milk'));

然后检查---- .id find 找到了一些东西(未找到---- 03 null !或者,您可以 filter 对于包含牛奶的产品,然后将所有结果映射到它们的 id:

 products.filter(product =>
  product.items.some(item => item.name === 'milk');
).map(product =>
  product.id
) // [03]

原文由 Bergi 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道你提到了 ES6,但在这种情况下(如果你想返回内部对象)我相信最好使用 for / of 而不是 map / reduce / find :

 for (let p of products) {
  for (let i of p.items) {
    if (i.name === 'milk') return i;
  }
}

原文由 ariel 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题