【问题标题】:Looping through an array of objects to create a list array循环遍历对象数组以创建列表数组
【发布时间】:2021-03-24 05:41:36
【问题描述】:

我在从对象数组创建列表数组时遇到问题。我不确定我哪里出错了。这是我的问题:

查找所有设计师的所有鞋子,并以这种格式将它们列在数组中:

[[设计师姓名,鞋名,价格],[设计师姓名,鞋名,价格],....] 例如,

const currentInventory = [
  {
    name: 'Brunello Cucinelli',
    shoes: [
      {name: 'tasselled black low-top lace-up', price: 1000},
      {name: 'tasselled green low-top lace-up', price: 1100},
      {name: 'plain beige suede moccasin', price: 950},
      {name: 'plain olive suede moccasin', price: 1050}
    ]
  },
  {
    name: 'Gucci',
    shoes: [
      {name: 'red leather laced sneakers', price: 800},
      {name: 'black leather laced sneakers', price: 900}
    ]
  }
];

function renderInventory(inventory) {
 let arr = [];
 
 for(let i = 0; i < inventory.length; i++) {
   for(let j = 0;j < inventory[i].shoes.length; j++) {
     arr.push([`${inventory[i].name}, ${inventory[i].shoes[j].name}, ${inventory[i].shoes[j].price}`])
   }
 }
 
  return arr;
}

我收到此错误,但不知道为什么?

Expected $[0].length = 1 to equal 3. Expected $[0][0] = 'Brunello Cucinelli, tasselled black low-top lace-up, 1000' to equal 'Brunello Cucinelli'. Expected $[0][1] = undefined to equal 'tasselled black low-top lace-up'. Expected $[0][2] = undefined to equal 1000. Expected $[1].length = 1 to equal 3. Expected $[1][0] = 'Brunello Cucinelli, tasselled green low-top lace-up, 1100' to equal 'Brunello Cucinelli'. Expected $[1][1] = undefined to equal 'tasselled green low-top lace-up'. Expected $[1][2] = undefined to equal 1100. Expected $[2].length = 1 to equal 3. Expected $[2][0] = 'Brunello Cucinelli, plain beige suede moccasin, 950' to equal 'Brunello Cucinelli'. Expected $[2][1] = undefined to equal 'plain beige suede moccasin'. Expected $[2][2] = undefined to equal 950. Expected $[3].length = 1 to equal 3. Expected $[3][0] = 'Brunello Cucinelli, plain olive suede moccasin, 1050' to equal 'Brunello Cucinelli'. Expected $[3][1] = undefined to equal 'plain olive suede moccasin'. Expected $[3][2] = undefined to equal 1050. Expected $[4].length = 1 to equal 3. Expected $[4][0] = 'Gucci, red leather laced sneakers, 800' to equal 'Gucci'. Expected $[4][1] = undefined to equal 'red leather laced sneakers'. Expected $[4][2] = undefined to equal 800. Expected $[5].length = 1 to equal 3. Expected $[5][0] = 'Gucci, black leather laced sneakers, 900' to equal 'Gucci'. Expected $[5][1] = undefined to equal 'black leather laced sneakers'. Expected $[5][2] = undefined to equal 900.

还有,

我认为我也可以使用 .map() 和 .reduce() 来解决这个问题,但我不知道从哪里开始。

【问题讨论】:

  • 你能举一个你想要的结构的例子
  • [[设计师姓名,鞋名,价格],[设计师姓名,鞋名,价格],....] 例如,
  • 如果您认为其中一个答案有帮助,请将其标记为已接受,请点击下方的按钮。

标签: javascript for-loop foreach array.prototype.map


【解决方案1】:

你需要检查长度

for(let j = 0; j < inventory[i].shoes.length; j++) {
               ^^^^

const currentInventory = [
  {
    name: 'Brunello Cucinelli',
    shoes: [
      {name: 'tasselled black low-top lace-up', price: 1000},
      {name: 'tasselled green low-top lace-up', price: 1100},
      {name: 'plain beige suede moccasin', price: 950},
      {name: 'plain olive suede moccasin', price: 1050}
    ]
  },
  {
    name: 'Gucci',
    shoes: [
      {name: 'red leather laced sneakers', price: 800},
      {name: 'black leather laced sneakers', price: 900}
    ]
  }
];

function renderInventory(inventory) {
 let arr = [];
 
 for(let i = 0; i < inventory.length; i++) {
   for(let j = 0; j < inventory[i].shoes.length; j++) {
     arr.push([`${inventory[i].name}, ${inventory[i].shoes[j].name}, ${inventory[i].shoes[j].price}`])
   }
 }
 
  return arr;
}

console.log(renderInventory(currentInventory));

更简单的方法是通过直接获取对象来使用for ... of statement

function renderInventory(inventory) {
    let arr = [];

    for (const { name, shoes } of inventory)
        for (const shoe of shoes)
            arr.push([`${name}, ${shoe.name}, ${shoe.price}`]);

    return arr;
}

const
    currentInventory = [{ name: 'Brunello Cucinelli', shoes: [{ name: 'tasselled black low-top lace-up', price: 1000 }, { name: 'tasselled green low-top lace-up', price: 1100 }, { name: 'plain beige suede moccasin', price: 950 }, { name: 'plain olive suede moccasin', price: 1050 }] }, { name: 'Gucci', shoes: [{ name: 'red leather laced sneakers', price: 800 }, { name: 'black leather laced sneakers', price: 900 }] }];


console.log(renderInventory(currentInventory));

【讨论】:

  • 这不是我在做的吗?我不确定您在这里指的是什么: for(let j = 0; j
  • 不,你只有长度没有与j比较。
  • 好的,我用 j 比较更新了它。它给了我一个更长的全新错误
  • 还有哪一个?
  • 预期 $.length = 4 等于 6。预期 $[0].length = 1 等于 3。预期 $[0][0] = 'Brunello Cucinelli,流苏黑色低帮蕾丝-up, 1000' 等于 'Brunello Cucinelli' .....
【解决方案2】:

你需要这样写:

for(let i = 0; i < inventory.length-1; i++) {
    // code here
}

错误原因是length属性不一定表示数组中定义值的个数。

let array = ['apple', 'banana'];

console.log(array.length);
// Expected result: 2

console.log(array[2]);
// Expected result: undefined

这就是最后一项未定义的原因。

【讨论】:

    【解决方案3】:

    在这一行中你错过了一个比较

    for(let j = 0; inventory[i].shoes.length; j++) {
    

    写这个

       for(let j = 0;j < inventory[i].shoes.length; j++) {
    

    const currentInventory = [
      {
        name: 'Brunello Cucinelli',
        shoes: [
          {name: 'tasselled black low-top lace-up', price: 1000},
          {name: 'tasselled green low-top lace-up', price: 1100},
          {name: 'plain beige suede moccasin', price: 950},
          {name: 'plain olive suede moccasin', price: 1050}
        ]
      },
      {
        name: 'Gucci',
        shoes: [
          {name: 'red leather laced sneakers', price: 800},
          {name: 'black leather laced sneakers', price: 900}
        ]
      }
    ];
    
    function renderInventory(inventory) {
     let arr = [];
     
     for(let i = 0; i < inventory.length; i++) {
       for(let j = 0; j < inventory[i].shoes.length; j++) {
         arr.push([inventory[i].name, inventory[i].shoes[j].name, inventory[i].shoes[j].price])
       }
     }
     
      return arr;
    }
    
    console.log(renderInventory(currentInventory));

    【讨论】:

    • 好的,我更正了,但它引发了一个全新的错误
    • 哪个扔的?
    • 预期 $.length = 4 等于 6。预期 $[0].length = 1 等于 3。预期 $[0][0] = 'Brunello Cucinelli,流苏黑色低帮蕾丝-up, 1000' 等于 'Brunello Cucinelli'。 ....
    • 你用这个美元语法做什么?
    • 我没有使用那个......那是失败测试的直接副本......我相信它是一个意外的结果错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2018-06-19
    • 1970-01-01
    • 2020-07-19
    • 2016-09-07
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多