JavaScript 从嵌套对象获取值

JavaScript get value from nested object

如果这是我的对象:

var obj = {
bakery1: {
    small: {
        name: "Small cookie",
        price: 0.75;
    }
    large: {
        name: "Large cookie",
        price: 3.00;
    }
}
bakery2: {
    small: {
        name: "Small cookie",
        price: 1.00;
    }
    large: {
        name: "Large cookie",
        price: 4.00;
    }
}
};

我将如何制作一个将每个价格打印到控制台的循环?

当打印这个值时,有没有办法追踪这个名字?

例如,如果输出是 3.00,我将如何创建一个函数来为我提供与 3.00 价格一致的名称?

提前致谢!

运行 看看效果如何

var obj = {
  bakery1: {
    small: {
      name: "Small cookie",
      price: 0.75
    },
    large: {
      name: "Large cookie",
      price: 3.00
    }
  },
  bakery2: {
    small: {
      name: "Small cookie",
      price: 1.00
    },
    large: {
      name: "Large cookie",
      price: 4.00
    }
  }
};

Object.keys(obj).map((name) => {
  Object.keys(obj[name]).map((type) => document.write(`${name}-${type}-${obj[name][type].name}-${obj[name][type].price}<br/>`))
})

回答你的问题:

function printPrice(obj) {
  if (obj.price)
    console.log(obj.name, obj.price)

  else for (key in obj)
    printPrice(obj[key])
}

var obj = {
  "bakery1": {
    "small": {
      "name": "Small cookie",
      "price": 0.75
    },
    "large": {
      "name": "Large cookie",
      "price": 3
    }
  },
  "bakery2": {
    "small": {
      "name": "Small cookie",
      "price": 1
    },
    "large": {
      "name": "Large cookie",
      "price": 4
    }
  }
};

printPrice(obj)

但是,对于这些类型的集合,使用数组可能会更好。例如,我们可以这样做:

var bakeries = [
  {
    name: 'Bakery 1',
    menu: [
      {name: 'small cookie', price: 0.75},
      {name: 'large cookie', price: 3.00}
    ]
  },

  {
    name: 'Bakery 2',
    menu: [
      {name: 'small cookie', price: 1.00},
      {name: 'large cookie', price: 4.00}
    ]
  }
]

这使我们能够更好地组织每个项目的特定属性。在这种情况下,打印价格的代码变得更加简单:

bakeries
  .map(bakery => bakery.menu)
  .forEach(menu => menu.map(
    item => console.log(item.name, item.price)))

递归函数。

function objSearch(serObj){
    // For loop through the object.
    for( prop in serObj ){
        // If the property is price get the price.
        if(prop === 'price'){
            // Got the price property now return the value of price.
            console.log('I have price...', prop, '=', serObj[prop]);
            // If the property is an object send it through the function again.
        } else if(typeof serObj[prop] === 'object'){  
            // Pass the nested object.
            objSearch(serObj[prop]);
        }
    }
}

objSearch(obj);