【问题标题】:JavaScript iterate through nested objects for keys with values above given numberJavaScript 遍历嵌套对象以获取值高于给定数字的键
【发布时间】:2021-01-18 10:23:42
【问题描述】:

我来自 Python 背景,所以在迭代 JS 对象方面我还比较陌生。使用 Python,您可以创建嵌套的 for 循环以进入键值对。我的问题是如何遍历这个对象并将大于给定数字的值附加到数组中。

我需要遍历的对象

const foodmenu = {
    title: 'Menu',
    sections: [
        {
            title: 'App',
            items: [
                {
                    title: 'Cookie',
                    available: true,
                    price: 3
                },
                {
                    title: 'Snicker',
                    available: true,
                    price: 12
                },
                {
                    title: 'Donuts',
                    available: true,
                    price: 11
                }
            ]
        },
        {
            title: 'FullMeal',
            items: [
                {
                    title: 'Steak',
                    available: false,
                    price: 33
                },
                {
                    title: 'Chinese Chicken',
                    available: true,
                    price: 14
                },
                {
                    title: 'Fried Chicken',
                    available: false,
                    price: 17
                }
            ]
        },

    ]
}

因此,首先我需要创建一个函数,该函数接收价格数字并接收对象。所以这是我到目前为止所尝试的,我不知道所有的 JS 语法,但在这一点上它比工作代码更伪代码。

function findPriceAbove(price, foodmenu){
//create empty array to append the key names and values, E.G. ['App-Cookie(3)']    
const abovePriceArray = []

for (var key in foodmenu){
    if (foodmenu.hasOwnProperty(key)){
        for (const [key, value] of Object.entries(foodmenu)) {
                if foodmenu[value] > price and available == true;
                    abovePriceArray.push(key(App),name(Cookie),value(3)
              }
}
}
return abovePriceArray
}

【问题讨论】:

  • 您能否通过示例显示您想要的示例输出
  • 例如,如果价格为 13,则 abovePriceArray = ['FullMeal-Chinese Chicken(14)'] 因为“available is true”并且它是唯一高于 13 的可用价格。输出将是该数组 ['FullMeal-Chinese Chicken(14)']

标签: javascript


【解决方案1】:

这是一个使用reduce() 的示例,使用forEach() 迭代每个类别的items 数组并将匹配元素的template literal 推送到累加器。

const foodmenu = { title: 'Menu', sections: [{ title: 'App', items: [{ title: 'Cookie', available: true, price: 3 }, { title: 'Snicker', available: true, price: 12 }, { title: 'Donuts', available: true, price: 11 }] }, { title: 'FullMeal', items: [{ title: 'Steak', available: false, price: 33 }, { title: 'Chinese Chicken', available: true, price: 14 }, { title: 'Fried Chicken', available: false, price: 17 }] },] };

function findPriceAbove(price, foodmenu) {
  return foodmenu.reduce((a, category) => {
    category.items.forEach(item => {
      if (item.price > price && item.available) {
        a.push(`${category.title}-${item.title}(${item.price})`);
      }
    })
    return a;
  }, []); // <-- pass an empty array as the initial accumulator value
}

console.log(findPriceAbove(13, foodmenu.sections))

【讨论】:

  • 你能告诉我reduce at "a" 我们声明一个空数组吗?
  • 是的,reduce(()={},[]) 的第二个参数是作为回调的第一个参数传递的初始 accumulator 值。在这种情况下,它是一个空数组,但您可以传入任何内容,或者如果未传入,则数组中的第一个元素将用作初始值。
【解决方案2】:

你可以这样做

function getAbovePriceArray(givenPrice) {
    const abovePriceArray = [];

    foodMenu.sections.forEach((foodType) => {
        foodType.items.forEach((foodItem) => {
            if (foodItem.available && foodItem.price > givenPrice) {
                abovePriceArray.push(`${foodType.title}-${foodItem.title}(${foodItem.price})`);
            }
        })

    });

    return abovePriceArray;
}

【讨论】:

    【解决方案3】:

    我把整个例子都放了……(只需要复制粘贴)我检查了代码,它就像我理解的那样工作:

    const foodmenu = {
      title: 'Menu',
      sections: [
          {
              title: 'App',
              items: [
                  {
                      title: 'Cookie',
                      available: true,
                      price: 3
                  },
                  {
                      title: 'Snicker',
                      available: true,
                      price: 12
                  },
                  {
                      title: 'Donuts',
                      available: true,
                      price: 11
                  }
              ]
          },
          {
              title: 'FullMeal',
              items: [
                  {
                      title: 'Steak',
                      available: false,
                      price: 33
                  },
                  {
                      title: 'Chinese Chicken',
                      available: true,
                      price: 14
                  },
                  {
                      title: 'Fried Chicken',
                      available: false,
                      price: 17
                  }
              ]
          },
    
      ]
    }
    
    function findPriceAbove(minPrice, foodMenu){
      //create empty array to append the key names and values, E.G. ['App-Cookie(3)']    
    
      return foodMenu.sections.reduce((acum, current) => {
        return acum.concat(
          current.items
            .filter(item=> item.price > minPrice && item.available)
            .map(elem => `${current.title}-${elem.title}(${elem.price})`)
        )
      }, [])
    
      }
    
      console.log(
      findPriceAbove(10, foodmenu) //?
      ) 
    /*
    [
      'App-Snicker(12)',
      'App-Donuts(11)',
      'FullMeal-Steak(33)',
      'FullMeal-Chinese Chicken(14)',
      'FullMeal-Fried Chicken(17)'
    ]
    */
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2013-06-18
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2017-12-24
      • 2018-08-28
      • 2021-12-28
      相关资源
      最近更新 更多