获取过滤值的对象键

28

情况很简单 - 我有一个以下的对象:

Object {1: false, 2: true, 3: false, 4: false, 5: false, 6: false, 7: false, 8: true, 12: false, 13: false, 14: false, 15: false, 16: false, 17: false, 18: false, 19: false} 

我需要使用underscore获取所有值为true的id数组。在上述情况下,代码如下:

[2, 8]

我尝试了一些方法,但是卡住了。有人有什么想法吗?

14个回答

0
我使用这个方法: 使用 lodash 从对象中检索具有相同值的所有键(不仅限于只有布尔值的对象)

function allKeys(obj, value) {
  _.keys(_.pick(obj, function (v, k) { return v === value; }));
}

例子:

var o = {a: 3, b: 5, c: 3};
var desiredKeys = allKeys(o, 3);
// => [a, c]

0
function findKey(obj, value){
    var key;

    _.each(_.keys(obj), function(k){
      var v = obj[k];
      if (v === value){
        key = k;
      }
    });

    return key;
}

不幸的是,_.invert(myObject) 返回 Object {false: "19", true: "8"},因此它应用最后匹配的元素。这不是我想要的。 - ducin
非常抱歉之前没有看到你的评论。我在 jsfiddle 上检查了一下,然后才意识到。但是这应该可以运行。这个版本有什么问题吗? - user1853788

0
这是一种在ES6中不使用任何库的方法。
let z = {2: true, 3:false, 8:true, 9:false, 10: false}
Array.from(new Set(Object.keys(z).map(function(k){if(z[k]){return k}}))).filter(f=>f)

然后您将得到 [2, 8]


1
使用传统函数的替代方法是 Array.from(new Set(Object.keys(z).map(function(k){if(z[k]){return k}}))).filter(function(f){if(f){return true}}) - Ricky Sahu

-5

我不知道 underscore.js。但是使用普通的JS,我已经编写了以下代码。

function myFunction()
{
var str="1: false; 2: true; 3: false; 4: false; 5: false; 6: false; 7: false; 9: true; 12: false";
var n=str.split(";");

for(var i=0;i<n.length;i++)
{
     if(n[i].search("true")!=-1){
     alert(n[i].slice(0,n[i].search(":")));
     }
}

1
这真的不是我要找的。我有一个普通对象,而不是一个字符串。 - ducin
@tkoomzaaskz 你不能从对象中获取值吗? - TechBytes
抱歉,我不明白你的意思。我正在寻找一个简短的下划线解决方案,就像我在描述中写的那样。 - ducin
将真实对象转换为字符串表示形式就像对其进行序列化。当然,可以首先使用JSON序列化程序,然后应用您的解决方案。但是,说真的。为什么要将对象转换为字符串并操纵它呢?使用真实表示法更好、易于维护和理智。问题也涉及下划线解决方案,而这不是。 - Spiralis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接