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

新手上路,请多包涵

我想使用 lodash 从 _对象_(不是数组)中获取前 n 个键/值对。我找到 了 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?

原文由 vt5491 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

var obj = {  b: 3, y: 2, a: 1 };

目前尚不清楚“前 2”指的是什么 - 你想要 ab 因为这是字母顺序吗?如果是这样,它们是否按此顺序排列?如果不是,您是否想要 by 因为它们先出现?也许您想要 ay 因为它们的值最低?

除了不重复之外,无法保证您会得到什么,因此所有这些组合都是有效的。此外,您可以按任何顺序获取它们 ya 是同样有效的输出 您可能更喜欢一个或另一个,但它通常不会使其正确。

有很多方法可以解决这个问题,但您必须接受您需要处理非订单。

纯 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.keysArray.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) );
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

如您所见,它与以前几乎相同。执行此任务的语法和 确切 方法可能有所不同,但要点应该仍然存在——您需要排序以保持一致性, 然后 您可以获得任意数量的项目。

原文由 VLAZ 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您查看 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);

原文由 Samuel Toh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题