如何使用lodash获取对象的前n个元素?

vt5*_*491 8 javascript underscore.js lodash

我想使用lodash 从对象(而不是数组)中获取前n个键/值对.我发现这个答案下划线,这表示使用使用第一(在lodash不存在),或者使用(仅适用于数组).

尝试从对象获取'a:7'和'b:8'对的示例节点会话:

> var ld=require("lodash")
undefined
> var o={a:7, b:8, c:9}
undefined
> ld.keys(o)
[ 'a', 'b', 'c' ]
> ld.take(o, 2)
[]
> ld.first(o, 2)
undefined
> 
Run Code Online (Sandbox Code Playgroud)

当然,使用lodash必须有一些简单的方法来做到这一点,但对于我的生活,我找不到任何东西.也许我不得不诉诸本地的js?

VLA*_*LAZ 6

如果不编写自定义代码,则无法获取对象的前N个元素.这是因为对象中没有元素的排序,所以如果有一个库函数,它将永远不能保证给你你期望的元素.给定一个对象

var obj = {  b: 3, y: 2, a: 1 };
Run Code Online (Sandbox Code Playgroud)

目前尚不清楚"前2"是指什么 - 你想要什么a,b因为这是字母顺序?如果是这样,他们是否按顺序?如果没有,你想要b,y因为它们首先出现?也许你想要a,y因为他们的价值最低?

除了没有重复之外,您无法保证获得什么,因此所有这些组合都是有效的.此外,您可以按任何顺序获取它们y并且a同样有效的输出您可能更喜欢这样或那样但是它通常不会使它正确.

有很多方法,但你必须接受你需要处理非订单.

纯JavaScript解决方案.

function firstN(obj, n) {
  return Object.keys(obj) //get the keys out
    .sort() //this will ensure consistent ordering of what you will get back. If you want something in non-aphabetical order, you will need to supply a custom sorting function
    .slice(0, n) //get the first N
    .reduce(function(memo, current) { //generate a new object out of them
      memo[current] = obj[current]
      return memo;
    }, {})
}
var obj = { b: 2, y: 25, a: 1 }

console.log( firstN(obj, 2) );
Run Code Online (Sandbox Code Playgroud)

这是使用Object.keys,Array.prototype.sortArray.prototype.reduce

使用lodash可以实现同样的目的,但并不比这更简洁 - 它将涉及调用类似的功能.它可以这样做,例如:

function firstN(obj, n) {
  return _.chain(obj)
    .keys()
    .sort()
    .take(n)
    .reduce(function(memo, current) {
      memo[current] = obj[current];
      return memo;
    }, {})
    .value();
}

var obj = { b: 2, y: 25, a: 1 }
      
console.log( firstN(obj, 2) );
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

如你所见,它与以前几乎一样.语法和执行此任务的确切方法可能有所不同,但主要观点应该仍然存在 - 您需要对一致性进行排序,然后您可以获得任意数量的项目.