我想使用lodash从对象(而不是数组)中获取前n个键/值对.我找到了
this answer for underscore,它说首先使用use(在lodash中不存在),或者使用take(仅适用于数组).
尝试从对象获取’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 >
当然,使用lodash必须有一些简单的方法来做到这一点,但对于我的生活,我找不到任何东西.也许我不得不诉诸本地的js?
解决方法
如果不编写自定义代码,则无法获取对象的前N个元素.这是因为有
no ordering of the elements in objects,所以如果有一个库函数,它永远不会保证给你你期望的元素.给定一个对象
var obj = { b: 3,y: 2,a: 1 };
目前尚不清楚“前2”是指什么 – 你想要a和b,因为这是字母顺序吗?如果是这样,他们是否按顺序?如果没有,你想要b和y因为它们首先出现吗?也许你想要a和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) );
这是使用Object.keys,Array.prototype.sort和Array.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,a: 1 } console.log( firstN(obj,2) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
如你所见,它与以前几乎一样.语法和执行此任务的确切方法可能有所不同,但主要观点应该仍然存在 – 您需要对一致性进行排序,然后您可以获得任意数量的项目.