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

我想使用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.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,a: 1 }
      
console.log( firstN(obj,2) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...