【问题标题】:underscore.js find objects with same propertiesunderscore.js 查找具有相同属性的对象
【发布时间】:2014-08-14 01:55:59
【问题描述】:

我正在寻找最好的 Underscore/JS 方法,它查看对象数组并在集合中的所有对象都具有相同值的属性时返回 true 或 false。 即:

如果我检查所有 'myprop' 是否相等,这应该返回 true。 var myarr = [{ myprop:'123'},{ myprop:'123'},{ myprop:'123'}] .

所以,如果每个集合中的 'myprop' 值相同,则返回 true。

显然这应该返回 false: var myarr = [{ myprop:'123'},{ myprop:'357'},{ myprop:'123'}]

谢谢!

【问题讨论】:

  • 能否让您的格式可读?我修好了,你又恢复了。 -1 直到你把它清理干净。

标签: underscore.js


【解决方案1】:

你可以使用 undescore every

_.every(list, [predicate], [context]) 别名:all 如果返回 true 列表中的所有值都通过了谓词真值测试。代表 到本地方法每个,如果存在的话。

_.every([true, 1, null, 'yes'], _.identity); => 错误

var myvar1 = [{ myprop:'123'},{ myprop:'123'},{ myprop:'123'}]

_.every(myvar1, function(myvar){return myvar.myprop === '123'});

返回真。

var myvar2 = [{ myprop:'123'},{ myprop:'357'},{ myprop:'123'}]

_.every(myvar2, function(myvar){return myvar.myprop === '123'});

返回假。

Fiddle

【讨论】:

  • 谢谢!是的,我使用 _.pluck 和 _.every 来完成这项工作。非常感谢
【解决方案2】:

没有快速和肮脏的功能,但如果你能保证该属性存在于所有对象上:

_.uniq(_.pluck(myarr, 'myprop')).length == 1

正如 djechlin 所指出的,如果您不能保证密钥存在,上述操作将失败。你可以使用:

var myAttrArr = _.pluck(myarr, 'myprop')
myAttrArr.length == myarr.length && _.uniq(myAttrArr).length == 1

您也可以只使用 every 和一些额外的逻辑:

var checkVar = myarr['myprop'];
var success = checkVar && _.every(myarr, function(myobj) {
   return myobj['myprop'] === checkVar;
});

【讨论】:

  • 只用长度==原件长度?你写的只是检查一个有它。
  • 提取属性,如果只有一个唯一的,它们都是一样的
  • 所以我猜对了一半。如果道具完全丢失,这将失败。
【解决方案3】:

可用于两个功能。将Array.prototype.everyhasOwnPropertyhas 一起使用。

【讨论】:

    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2012-06-27
    相关资源
    最近更新 更多