如何使用 lodash 获取对象的前 n 个元素?
How to get first n elements of an object using lodash?
我想使用 lodash 从 object(不是数组)中获取前 n key/value 对。我发现 this answer for underscore,它说使用 first(在 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?
如果您查看 first
的 loadash 文档。它只接受一个数组作为它的参数,这可能不是要使用的 API。
参见:https://lodash.com/docs/3.10.1#first
这是您可以使用标准 Javascript
API.
解决的 1 种方法
这里的要点是您可以使用 Object.keys(...)[index]
API 根据元素的位置检索元素的键。
然后您需要做的就是循环 n
次并使用派生密钥将其推入另一个对象。
var firstN = 2;
var o={a:7, b:8, c:9};
var result = {};
for (var index=0; index < firstN; index++) {
var key = Object.keys(o)[index];
result[key] = o[key];
}
console.log(result);
如果不编写自定义代码,则无法获取对象的前 N 个元素。这是因为有 no ordering of the elements in objects,所以如果有它的库函数,它永远不能保证给你你期望的元素。给定一个对象
var obj = { b: 3, y: 2, a: 1 };
不清楚 "first 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) );
这正在使用 Object.keys, Array.prototype.sort, and 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, y: 25, a: 1 }
console.log( firstN(obj, 2) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
如您所见,它与以前几乎相同。语法和执行此任务的 exact 方法可能有所不同,但要点应该仍然存在 - 您需要排序以保持一致性,然后 您可以获得任意数量的物品。
没有直接的解决方案。受之前答案和评论的启发,并阅读了几篇关于非保证属性顺序的文章,我创建了一个解决方案,首先对键进行排序。
对键进行排序
这是一种可用的单行方法,带有排序键(因此保证顺序)。
链接
_.chain(object).toPairs().sortBy(0).take(2).fromPairs().value()
没有链接
_.fromPairs(_.take(_.sortBy(_.toPairs(object), 0), 2)),
排序详情
sortBy(0)
按 keys(索引 0
)对我们的集合进行排序。 原始对象首先由toPairs()
转换为对数组(每个对 是一个数组 [key, value]
) 然后按这些 对 的第一个值排序(key
在 [=35= 中有索引 0
]对).
重要提示:正如之前的回答和评论中所提到的,即使在最新的ES版本中,也无法保证属性的顺序。参见 。因此,我正在对键进行排序。
我想使用 lodash 从 object(不是数组)中获取前 n key/value 对。我发现 this answer for underscore,它说使用 first(在 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?
如果您查看 first
的 loadash 文档。它只接受一个数组作为它的参数,这可能不是要使用的 API。
参见:https://lodash.com/docs/3.10.1#first
这是您可以使用标准 Javascript
API.
这里的要点是您可以使用 Object.keys(...)[index]
API 根据元素的位置检索元素的键。
然后您需要做的就是循环 n
次并使用派生密钥将其推入另一个对象。
var firstN = 2;
var o={a:7, b:8, c:9};
var result = {};
for (var index=0; index < firstN; index++) {
var key = Object.keys(o)[index];
result[key] = o[key];
}
console.log(result);
如果不编写自定义代码,则无法获取对象的前 N 个元素。这是因为有 no ordering of the elements in objects,所以如果有它的库函数,它永远不能保证给你你期望的元素。给定一个对象
var obj = { b: 3, y: 2, a: 1 };
不清楚 "first 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) );
这正在使用 Object.keys, Array.prototype.sort, and 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, y: 25, a: 1 }
console.log( firstN(obj, 2) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
如您所见,它与以前几乎相同。语法和执行此任务的 exact 方法可能有所不同,但要点应该仍然存在 - 您需要排序以保持一致性,然后 您可以获得任意数量的物品。
没有直接的解决方案。受之前答案和评论的启发,并阅读了几篇关于非保证属性顺序的文章,我创建了一个解决方案,首先对键进行排序。
对键进行排序
这是一种可用的单行方法,带有排序键(因此保证顺序)。
链接
_.chain(object).toPairs().sortBy(0).take(2).fromPairs().value()
没有链接
_.fromPairs(_.take(_.sortBy(_.toPairs(object), 0), 2)),
排序详情
sortBy(0)
按 keys(索引 0
)对我们的集合进行排序。 原始对象首先由toPairs()
转换为对数组(每个对 是一个数组 [key, value]
) 然后按这些 对 的第一个值排序(key
在 [=35= 中有索引 0
]对).
重要提示:正如之前的回答和评论中所提到的,即使在最新的ES版本中,也无法保证属性的顺序。参见