【问题标题】:NodeJS find object in array by value of a key [duplicate]NodeJS通过键的值在数组中查找对象[重复]
【发布时间】:2016-07-15 13:40:05
【问题描述】:

我正在尝试通过其中一个键的值来获取数组中的对象。

数组:

var arr = [
        {
            city: 'Amsterdam',
            title: 'This is Amsterdam!'
        },
        {
            city: 'Berlin',
            title: 'This is Berlin!'
        },
        {
            city: 'Budapest',
            title: 'This is Budapest!'
        }
];

我尝试用lodash 做类似的事情,但没有成功。

var picked = lodash.pickBy(arr, lodash.isEqual('Amsterdam');

它返回一个空对象。

关于我如何以 lodash 方式做到这一点的任何想法(如果可能的话)?我可以用经典的方式来做,创建一个新数组,遍历所有对象并将符合我的条件的对象推送到那个新数组。但是有没有办法用 lodash 做到这一点?

这不是重复的。

【问题讨论】:

  • @JoachimIsaksson 为什么不能发布答案?这正是我想要的!我会将其标记为已回答
  • @Rajesh 因为统一原则。我在我的 Node 应用程序中使用 lodash 进行所有对象/数组操作,如果可能的话 - 我想尽可能使用它。
  • 是的,关于 SO 的 10M 问题中没有一个问过如何根据对象的属性之一查找对象数组的元素。如果您不喜欢这个被标记为重复的问题,请尝试stackoverflow.com/questions/7364150/…
  • @torazaburo 要成为其他东西的复制品,它必须是相同的。这些问题都没有涉及任何 lodash。我专门要求 lodash,因此这不是重复的。
  • 我给出的链接包含下划线的答案,这与 lodash 几乎相同,并且对该答案的评论特别引用了 lodash。与其对重复的定义争论不休,我建议您只需浏览 lodash 文档,您将很快找到问题的答案。例如,您很快就会找到_.find 例程。您还会找到一个与您的用例完全匹配的示例,即_.find(users, _.matchesProperty('city', 'Amsterdam'));。为什么人们认为 SO 是“为我阅读文档”服务对我来说一直是个谜。

标签: javascript arrays node.js lodash


【解决方案1】:

您可以将Array.prototype.find() 与纯javascript一起使用:

var picked = arr.find(o => o.city === 'Amsterdam');

目前所有浏览器都不是compatible,你需要在你的环境中检查它(但它应该在NodeJS中工作)。

【讨论】:

  • 注意哪个版本的节点,不是所有版本都可以用。
  • 在 0.10.25 中无法使用,但在最新的 Node 版本中应该可以使用。
【解决方案2】:

使用lodash和箭头函数,应该很简单;

var picked = lodash.filter(arr, x => x.city === 'Amsterdam');

...或者与对象表示法交替;

var picked = lodash.filter(arr, { 'city': 'Amsterdam' } );

注意:上面的答案曾经基于pickBy,正如@torazaburo 在下面指出的那样,这对于用例来说不是一个好的选择。

【讨论】:

  • pickBy 不是他想要的。 pickBy 选择与谓词匹配的某些属性。它将创建一个对象而不是过滤数组。
【解决方案3】:

经典的方式更简单

试试

var output = arr.filter(function(value){ return value.city=="Amsterdam";})

【讨论】:

  • return value.city == 'Amsterdam'* :) 谢谢!
  • 好吧,为了挑剔,他说获取一个对象,而你正在返回一个对象列表。
【解决方案4】:

您可以使用Array.filter

正如@torazaburo 正确指出的那样,您不需要三元运算符return item[key]?item[key] === value:false。一个简单的检查return item[key] === value 就可以了。

var arr = [{
  city: 'Amsterdam',
  title: 'This is Amsterdam!'
}, {
  city: 'Berlin',
  title: 'This is Berlin!'
}, {
  city: 'Budapest',
  title: 'This is Budapest!'
}];

Array.prototype.findByValueOfObject = function(key, value) {
  return this.filter(function(item) {
    return (item[key] === value);
  });
}

document.write("<pre>" + JSON.stringify(arr.findByValueOfObject("city", "Amsterdam"), 0, 4) + "</pre>");

【讨论】:

  • 我认为应该只是return item[key] === value;
  • @torazaburo 是的,你是对的。有检查的习惯。将更新我的答案。
  • 我怎样才能只得到一个对象而不是数组?
  • @shiva 如果它是唯一的或者您希望第一次出现,您可以使用 Array.find 代替。如果不匹配,它将返回匹配的对象或null
猜你喜欢
  • 2021-05-29
  • 2023-01-17
  • 1970-01-01
  • 2018-06-25
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
相关资源
最近更新 更多