【问题标题】:Return object key with minimum property value返回具有最小属性值的对象键
【发布时间】:2021-07-26 03:24:09
【问题描述】:

我有一个带有多个键的对象(例如 idOne、idTwo、idThree、idFour)……每个键都包含一个对象数组。我想以最低价格返回并输出密钥。在本例中,idThree 包含 id 的最低价格,因此应输出 idThree。我有返回找到的最低价格的代码......但我的目标是返回密钥(idThree)。有没有更简单/更干净的方法?

const object = {
   idOne: [{ price: 300 }],
   idTwo: [{ price: 200 }, { price: 100 }],
   idThree: [{ price: 90 }, { price: 100 }],
   idFour: [{ price: 99 }, { price: 210 }]
}

当前代码

const arrayOfMinValues = []
for (const [key, value] of Object.entries(object)) {
  const minimumEntry = Math.min(...value.map(item => item.price))
  arrayOfMinValues.push(minimumEntry)
}

console.log('MIN VALUE IS: ', Math.min(...arrayOfMinValues)) // how can I return key?

【问题讨论】:

    标签: javascript arrays json object ecmascript-6


    【解决方案1】:

    如果您首先将对象转换为条目数组,并将每个子数组转换为数组中的单个最低价格,那么您可以.reduce 遍历所有这些最低价格并挑选出最低价格的条目一:

    const object = {
       idOne: [{ price: 300 }],
       idTwo: [{ price: 200 }, { price: 100 }],
       idThree: [{ price: 90 }, { price: 100 }],
       idFour: [{ price: 99 }, { price: 210 }]
    }
    
    const minEntry = Object.entries(object)
      .map(([key, arr]) => [key, Math.min(...arr.map(obj => obj.price))])
      .reduce((a, b) => a[1] > b[1] ? b : a);
    console.log('Min entry:', minEntry);

    要访问数组的属性,请使用[index],其中index 是您要访问的索引:

    const key = minEntry[0]
    

    【讨论】:

    • 谢谢!如果我希望 minEntry 只是“idThree”或键怎么办?我不在乎价格
    • 然后访问条目的关键部分。条目只是数组形式的键值对。
    • 呃...您对如何通过索引从数组中获取值感到困惑?
    • 不,大声笑,我很困惑它是如何减少到包括关键和最低价格的......希望只是将它减少到只是关键而不必参考索引......理想情况下是 minEntry应该是带键的字符串
    • 您需要做的就是从入口数组中获取密钥。使用.reduce 时,您必须将键和值(该键的最低价格)放在一起,以使逻辑正常工作。完成后,从找到的最小条目中提取密钥。
    【解决方案2】:

    您可以使用嵌套的reduce调用来获取具有最小keyvalue的对象,并解构key

    const object = {"idOne":[{"price":300}],"idTwo":[{"price":200},{"price":100}],"idThree":[{"price":90},{"price":100}],"idFour":[{"price":99},{"price":210}]}
    
    const { key } = Object.entries(object)
      .reduce((acc, [key, values]) =>
        values.reduce((r, { price }) => price < r.price ? { key, price } : r, acc)
      , { key: null, price: Infinity })
    
    console.log(key)

    【讨论】:

    • 谢谢!目的是什么: { key: null, price: Infinity } ?
    • 对象中要比较的初始值没有任何属性(空对象)。
    【解决方案3】:

    reduce() 的另一种变体使用 find()

    const object = {"idOne":[{"price":300}],"idTwo":[{"price":200},{"price":100}],"idThree":[{"price":90},{"price":100}],"idFour":[{"price":99},{"price":210}]}
    
    
    const [key, lp] = Object.entries(object).reduce((a, [k, v])=>{
         const low = v.find(o => o.price < a[1]);    
         return low ? [k, low.price] : a;   
    },[null,Infinity])
    
    console.log(key, ' has low price of ',lp )

    【讨论】:

      【解决方案4】:

      简单的方法与步骤一起使用:

      1. 创建sumPrices() 函数以获取价格总和。
      function sumPrices(arr){
          sum = 0;
          for(const price of arr){
              sum += price["price"]
          }
          return sum;
      }
      
      1. 创建变量keys 具有所有键。 创建两个变量minKey 最低价格的关键。 和minSum 最低价格的总和。
      const keys = Object.keys(object);
      let minKey = null,
          minSum = Number.MAX_SAFE_INTEGER;
      
      1. 遍历数组键 获取每个内部数组的每个总和 如果小于最小值,则将currentSumminSum 进行比较。 使用他们的接收密钥跟踪 minSum。
      for(const key of keys){
          const currentSum = sumPrices(object[key])
          if(currentSum <= minSum){
                minKey = key;
                minSum = currentSum;
          }
      }
      console.log(minKey);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-28
        • 2015-11-21
        相关资源
        最近更新 更多