NodeJS通过键的值在数组中查找对象[重复]

Posted

技术标签:

【中文标题】NodeJS通过键的值在数组中查找对象[重复]【英文标题】:NodeJS find object in array by value of a key [duplicate] 【发布时间】: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 问题中没有一个问过如何根据对象的属性之一查找对象数组的元素。如果您不喜欢这个被标记为重复的问题,请尝试***.com/questions/7364150/…。 @torazaburo 要成为其他东西的复制品,它必须是相同的。这些问题都没有涉及任何 lodash。我专门要求 lodash,因此这不是重复的。 我给出的链接包含下划线的答案,这与 lodash 几乎相同,并且对该答案的评论特别引用了 lodash。与其对重复的定义争论不休,我建议您只需浏览 lodash 文档,您将很快找到问题的答案。例如,您很快就会找到_.find 例程。您还会找到一个与您的用例完全匹配的示例,即_.find(users, _.matchesProperty('city', 'Amsterdam'));。为什么人们认为 SO 是“为我阅读文档”服务对我来说一直是个谜。 【参考方案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

以上是关于NodeJS通过键的值在数组中查找对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

excel中怎么查找一个值在表格中的位置

从JSON中获取重复的对象键的值,并只用一个键替换返回。

在java中的链接哈希图中查找特定键的值[重复]

如何在 JSON 对象中获取键的值 [重复]

根据对象中键的名称过滤对象数组[重复]

按特定键的内部数组的值对PHP二维数组进行排序[重复]