获取Lodash中已排序属性的键

时间:2017-10-02 16:30:39

标签: javascript lodash

我想返回由_.orderBy()方法返回的第一个对象的键,该方法按嵌套属性进行排序。

Here is the CodePen demo.在这种情况下,我想要返回的密钥是"charlie"

console.clear();

const ob = {
  "alpha": {
    "id": 27,
    "lottery": {
      "id": 1,
      "name": "La Primitiva",
      "jackpotAmount": 500,
    }    
  },
  "bravo": {
    "id": 28,
    "lottery": {
      "id": 1,
      "name": "La Primitiva",
      "jackpotAmount": 10,
    }    
  },
  "charlie": {
    "id": 29,
    "lottery": {
      "id": 1,
      "name": "La Primitiva",
      "jackpotAmount": 1000,
    }    
  },  
}

const out = _.orderBy(ob, (e) => {
  return e.lottery.jackpotAmount;
}, ['desc'] ); // How do I get key of first property, "charlie"?

console.log(out);

1 个答案:

答案 0 :(得分:3)

这不是获得最高jackpotAmount的最有效方法。排序为O(n log n)。您可以在O(n)时间内找到最高值。这也是创建列表的临时副本,因此它为临时操作使用了大量额外内存。使用_.maxBy()会更有效。

var x = _.maxBy(ob, (e) => { return e.lottery.jackpotAmount; });
return x.id;

这些功能适用于列表。要获取密钥而不是项目,您需要迭代密钥。

var keys = Object.keys(ob);
return _.maxBy(keys, (e) => { return ob[e].lottery.jackpotAmount; });

请注意,这并不能完全解决效率问题。根据javascript引擎,需要密钥数组和ob [e]查找的开销会将空间使用量降低到O(n),并且可能会降低O(n log n)的复杂性。

如果你的目标是现代JS引擎,你可以使用手写搜索的Map对象来获得恒定的空间和线性时间搜索。

const getMax = function (map) {
    let maxValue = null;
    let maxKey = null;

    map.forEach((value, key) => {
        if (value.lottery.jackpotAmount > maxValue) {
            maxValue = value.lottery.jackpotAmount;
            maxKey = key;
        }
    });

    return maxKey;
};

这是Codepen demo

干杯