【问题标题】:Is there a more efficient way to grab multiple minimum values in an object in Javascript?有没有更有效的方法来获取 Javascript 中对象中的多个最小值?
【发布时间】:2021-06-29 00:51:18
【问题描述】:

我对此有一个解决方案,但我不确定这是否是最好的方法.. 我有一个看起来像这样的对象:

const obj = {
  thingA: 1,
  thingB: 2,
  thingC: 1,
  thingD: 1,
  thingE: 4
}

我想获取所有具有最低值的键值对,然后能够随机选择具有最低值的键值对之一(在这种情况下,从三个具有最低值的键中随机选择一个1 作为值)。

这就是我所拥有的,并且可行,但我想知道是否有更好/更有效的方法:

const keyArray = Object.keys(obj)
const minArray = (keyArray) => {
  const min = keyArray.reduce((prev, curr) => obj[curr] ? prev : curr); 

  const res = [];
    for (const key of keyArray) {
      if (obj[key] !== obj[min]) {
       continue
      } 
     res.push(key)
   }
 return res
}

const randomMinKey = minArray(keyArray)[Math.floor(Math.random()*minArray.length)]

【问题讨论】:

  • const min = Math.min(...Object.values(obj)); const minPairs = Object.entries(obj).filter(([, v]) => v === min); const randomMinKey = minPairs[Math.floor(Math.random()*minPairs.length)]; 顺便说一句,我不完全确定在这种情况下“高效”是什么意思,但我假设“代码更少,可能更容易阅读”
  • 哈哈。有趣的是,你如何试图隐藏这个算法的真正目的。

标签: javascript arrays object filtering key-value


【解决方案1】:

一切只有一个循环! 并且只有一个直接分配;)

它还在一个动作中构建键数组,而不是先计算最小值,然后用这个键过滤所有元素。

const obj = { thingA: 1, thingB: 2, thingC: 1, thingD: 1, thingE: 4 }

let rand = Object.entries(obj).reduceRight((a,[k,v],idx)=>
  {
  if (v < a.min)   { a.min = v;  a.res.length = 0 }
  if (v === a.min) { a.res.push(k) }
  if (idx) return a
  else     return a.res[Math.floor(Math.random()*a.res.length)]
  },{ min:Infinity, res:[] } )

console.log( rand )

【讨论】:

    【解决方案2】:

    一个循环,与通过 reduce 循环然后通过对象键循环相比。

    const obj = {
      thingA: 1,
      thingB: 2,
      thingC: 1,
      thingD: 1,
      thingE: 4
    }
    
    function randomizeKey(_obj) {
      let objKeysArr = [];
      let minValue;
    
      for (const property in _obj) {
        if (minValue == undefined || _obj[property] < minValue) {
          objKeysArr = [];
          minValue = _obj[property];
        }
    
        if (_obj[property] == minValue) {
          objKeysArr.push(property);
        }
      }
    
      console.log(`all keys: ${objKeysArr}`);
    
      return objKeysArr[randomize(objKeysArr.length)];
    }
    
    function randomize(max, min) {
      return Math.floor(Math.random() * max) + (min || 0);
    }
    
    console.log( randomizeKey(obj) );

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多