Javascript 如何对对象使用下划线.js过滤器?

Javascript 如何对对象使用下划线.js过滤器?,javascript,jquery,underscore.js,Javascript,Jquery,Underscore.js,我有一个这样的目标: > Object > Rett@site.com: Array[100] > pel4@gmail.com: Array[4] > 0 id : 132 selected : true > 1 id : 51 selected : false 等等 如何使用下划线仅返回所选===true的项目 我从来没有必要使用\uu.filter()深入到各个层。差不多 var

我有一个这样的目标:

> Object
  > Rett@site.com: Array[100]
  > pel4@gmail.com: Array[4]
    > 0
       id : 132
       selected : true
    > 1
       id : 51
       selected : false
等等

如何使用下划线仅返回所选===true的项目

我从来没有必要使用
\uu.filter()
深入到各个层。差不多

var stuff=\u0.filter(me.collections,函数(item)){
返回项[0]。所选===true;
});

谢谢

如果要从选择的
true
的任何电子邮件地址中提取所有数组元素,可以这样迭代:

var selected = [];

for (email in emailLists) {
    selected.concat(_.filter(emailLists[email], function (item) {
        return item.selected === true;
    }));
}
如果您只想在所有元素都被选中的情况下提取数组,您可以执行以下操作:

var stuff = _.filter(me.collections, function(item) {
    return _.all(item, function (jtem) { 
        jtem.selected === true;
    });
});

我有一个名为allFilterValues的对象,包含以下内容:

{"originDivision":"GFC","originSubdivision":"","destinationDivision":"","destinationSubdivision":""}
这很难看,但您要求使用基于下划线的方法来过滤对象。这就是我仅返回具有非falsy值的过滤器元素的方式;您可以将筛选器的return语句切换到所需的任何位置:

    var nonEmptyFilters = _.pick.apply({}, [allFilterValues].concat(_.filter(_.keys(allFilterValues), function(key) {
        return allFilterValues[key];
    })));
输出(JSON/字符串化):


下划线的filter方法将在用作哈希或字典的对象上工作,但它将返回对象的可枚举值数组并去掉键。我需要一个函数来根据散列的值过滤散列,以保留键,并在Coffeescript中编写了以下内容:

hash_filter: (hash, test_function) ->
  keys = Object.keys hash

  filtered = {}
  for key in keys
    filtered[key] = hash[key] if test_function hash[key]
  filtered
如果您没有使用Coffeescript,下面是Javascript中的编译结果,稍微整理一下:

hash_filter = function(hash, test_function) {
  var filtered, key, keys, i;
  keys = Object.keys(hash);
  filtered = {};
  for (i = 0; i < keys.length; i++) {
    key = keys[i];
    if (test_function(hash[key])) {
      filtered[key] = hash[key];
    }
  }
  return filtered;
}


hash = {a: 1, b: 2, c: 3};
console.log((hash_filter(hash, function(item){return item > 1;})));
// Object {b=2, c=3}
hash\u filter=函数(hash,test\u函数){
过滤变量,键,键,i;
keys=Object.keys(散列);
过滤={};
对于(i=0;i1;}));
//对象{b=2,c=3}

TL;医生:太棒了

也许你想要一个最简单的方法

_.filter(me.collections, { selected: true})

@Dexygen的使用是正确的,但更干净的解决方案是可能的,因为该函数还接受谓词

返回对象的副本,经过筛选,只包含允许的键(或有效键数组)的值或者接受一个谓词,该谓词指示要拾取的键

(亮点是我的)

这是我在一个项目中使用的一个真实例子

_.pick({red: false, yellow: true, green: true}, function(value, key, object) {
    return value === true;
});
// {yellow: true, green: true}

你能澄清一下对象的格式吗?它看起来像是键入电子邮件地址的数组散列?没错,我如何澄清?您正试图从散列中拉出所有数组元素都具有
selected==true
?正确,仅具有selected==trueOk的项,仍然不太确定你在寻找什么,但发布了两种最有可能的情况的策略:^)谢谢,第一个答案,什么是“obj中的电子邮件”和“obj[email]”我拥有的对象称为“emaillist”,鉴于此,你能更新吗?thxstrange,我得到了一个“未捕获的语法错误:意外标识符”肯定
obj
应该是
emaillist
<代码>电子邮件
只是对象中每个元素的键。那个错误是怎么来的?(我没有测试!):^)很好,修复了错误。selected总是以“[]”的形式返回,我在里面做了一个console.log,并且“console.log(item.selected==true)”被正确地记录为true或false。由于某些原因,它没有将其添加到所选变量中。我添加了键作为第二个参数,正如下划线的
\uuu.filter()
所做的那样。希望这很酷!:)<代码>.\u带键对象的过滤器仅为
.\u拾取
_.pick({red: false, yellow: true, green: true}, function(value, key, object) {
    return value === true;
});
// {yellow: true, green: true}