为了账号安全,请及时绑定邮箱和手机立即绑定

在 Javascript 中访问(嵌套的)对象和数组

在 Javascript 中访问(嵌套的)对象和数组

倚天杖 2023-06-15 17:15:30
我不确定我是否对如何组织数组或如何访问它有误解。提议很简单:拥有一系列汽车品牌和型号并访问它们进行展示。const carBrands = [  {    Audi: {      models: ["A1", "A2", "A3", "A4"],      unitsAvailable: 378,    }  },  {    BMW: {      models: ["M1", "M2", "M3", "M4"],      unitsAvailable: 413,    },  },  {    Honda: {      models: ["H1", "H2", "H3", "H4"],      unitsAvailable: 226,    },  }];我可以这样访问每个模型:  carBrands.forEach((object, i) => {    console.log(object, i)  });这会返回我的对象和索引:奥迪 0 宝马 1 本田 2我不知道的是如何返回:品牌:奥迪型号:A1、A2、A3、A4 可用单位:378...对于 3 辆车中的每一辆。我知道我必须遍历数组并为每个循环返回对象键/值对。但是我在使用正确的语法时遇到了问题。这是我想弄清楚如何制定的内容:  let modelsToDisplay = [];  carBrands.forEach((object, i) => {    modelsToDisplay.push(<li key={i}>Make/Model/Units of each object</li>);  });感谢您的帮助:)
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

carBrands.flatMap(Object.entries)
    .map(([key, { models, unitsAvailable }]) => `${key} ${models.join(", ")} ${unitsAvailable}`)
    .forEach(v => console.log(v))


查看完整回答
反对 回复 2023-06-15
?
白衣非少年

TA贡献1155条经验 获得超0个赞

因为您的数组由 dict 对象组成,所以您需要考虑到您需要迭代键。在不修改输入的情况下,您可以使用以下代码来处理数据结构的内部值:


// For all defined objects

carBrands.forEach((object) => {

  // Determine manufacturers inside the current object (only 1 manufacturer per object in your case)

  var manufacturers = Object.keys(object);

  // For each manufacturer

  manufacturers.forEach((manufacturer) => {

    // Print manufacturer name

    console.log("Manufacturer: " + manufacturer);

    console.log("Models:");

    // For all models

    var models = object[manufacturer].models;

    models.forEach((model) => {

      // print model name

      console.log("  " + model);

    });

    // print available units

    console.log("Available units:");

    console.log("  " + object[manufacturer].unitsAvailable + "\n");

  });

});

输出:


Manufacturer: Audi

Models:

  A1

  A2

  A3

  A4

Available units:

  378


Manufacturer: BMW

Models:

  M1

  M2

  M3

  M4

Available units:

  413


Manufacturer: Honda

Models:

  H1

  H2

  H3

  H4

Available units:

  226


查看完整回答
反对 回复 2023-06-15
?
largeQ

TA贡献2039条经验 获得超7个赞

您遇到的问题是因为您使用的顶级密钥是唯一的。而不是命名您的键Audi,BMW等等。我会使用一个通用键make,并将其值设置为您的品牌。这样,当您执行循环时,您每次都可以请求相同的密钥:


const carBrands = [

  {

    make: 'Audi',

    models: ["A1", "A2", "A3", "A4"],

    unitsAvailable: 378

  },

  {

    make: 'BMW',

    models: ["M1", "M2", "M3", "M4"],

    unitsAvailable: 413

  },

];


carBrands.forEach(brand => {

    console.log(brand.make);


    brand.models.forEach(model => console.log(model));


});

由于您谈到要维护对象中的关系,我鼓励您考虑如何将此信息存储在数据库中,并以此为基础组织您的组织。


有很多carBrands。每个carBrand都有一个make, unitsAvailable, 并且有很多models.


您不会为每个创建一个新表carBrand,对吗?您将添加一个新行。因此,按照上面的方式构建它更接近于将其保存在数据库中的方式,这有利于数据完整性并使其更加灵活。


在这种结构中,通过 make 获取东西仍然很容易,例如:


let audiModels = carBrands.filter(brand => brand.make == 'Audi').models;


查看完整回答
反对 回复 2023-06-15
?
忽然笑

TA贡献1806条经验 获得超5个赞

这里的所有答案都是“正确的”,非常感谢你们!所以没有一个比另一个更好。

我认为乔纳森对我过于复杂的数据结构提出了一个很好的观点。我将回到更简单的版本,其中“Audi”等将是一个值,而不是一个键。

但我还将按照 Mottek 的建议构建当前结构和访问数据的示例。

当我深入到项目中时,我将决定哪个是最终版本。

感谢大家的大力帮助!


查看完整回答
反对 回复 2023-06-15
  • 3 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信