获取过滤值的对象键

duc*_*cin 27 javascript underscore.js

案例很简单 - 我有一个以下对象:

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} 
Run Code Online (Sandbox Code Playgroud)

我需要使用下划线来获得具有真正价值的ID数组.在上述情况下,将是:

[2, 8]
Run Code Online (Sandbox Code Playgroud)

我尝试了一些东西,但我有点卡住了.有谁有想法吗?

gus*_*nke 43

var keys = [];
_.each( obj, function( val, key ) {
  if ( val ) {
    keys.push(key);
  }
});
Run Code Online (Sandbox Code Playgroud)

使用普通的下划线可能有更简单/更短的方式.


如果这里的任何人使用Lodash而不是Underscore,以下也是可能的,这是非常简短易于阅读:

var keys = _.invert(obj, true)[ "true" ];
Run Code Online (Sandbox Code Playgroud)

  • 纯javascript(没有下划线)是相同的长.我希望有一种我在文档中遗漏的方法...... (5认同)

Clá*_*lva 9

Giorgi Kandelaki给出了一个很好的答案,但它有一些潜在的问题(请参阅我对他的回答的评论).

正确的方法是:

_(obj).pairs().filter(_.last).map(_.first)
Run Code Online (Sandbox Code Playgroud)

要么

_.map(_.filter(_.pairs(obj),_.last),_.first)
Run Code Online (Sandbox Code Playgroud)


Dmi*_*zin 8

var data = {1: false, 2: true, 3: false, 4: true};

var filteredIds = _.filter(_.keys(data), function (key) {
    return data[key];
});

// result [2, 4]


var rejectedIds = _.reject(_.keys(data), function (key) {
    return data[key];
});

// result [1, 3]
Run Code Online (Sandbox Code Playgroud)


Pål*_*Pål 5

你可以用_.pick.像这样:

var data = {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}

var keys = _.keys(_.pick(data, function(value) {
  return value;
}));
Run Code Online (Sandbox Code Playgroud)