【问题标题】:Underscore.js : findWhere with nested property valueUnderscore.js : findWhere 嵌套属性值
【发布时间】:2014-02-06 10:41:42
【问题描述】:

我该如何进行下面的过滤:

[{
    "id": 100,
    "title": "Tlt1",
    "tax": [{
        "name": "Tax1",
        "id": 15
    }, {
        "name": "Tax1",
        "id": 17
    }]
}, {
    "id": 101,
    "title": "Tlt2",
    "tax": [{
        "name": "Tax2",
        "id": 16
    }]
}, {
    "id": 102,
    "title": "Tlt3",
    "tax": [{
        "name": "Tax3",
        "id": 17
    }, {
        "name": "Tax3",
        "id": 18
    }]
}]

仅获取tax.id17 的那些,如下所示:

[
    {
        "id": 100,
        "title": "Tlt1",
        "tax": [
            {
                "name": "Tax1",
                "id": 15
            },
            {
                "name": "Tax1",
                "id": 17
            }
        ]
    },
    {
        "id": 102,
        "title": "Tlt3",
        "tax": [
            {
                "name": "Tax3",
                "id": 17
            },
            {
                "name": "Tax3",
                "id": 18
            }
        ]
    }
]

目前我使用下面的方法,但也许有更干净的方法来解决这个问题?

var arr = [];
_(data).each(function (v1, k1) {
    _(v1.tax).each(function (v2, k2) {
        if (v2.id == id) {
            arr.push(v1);
        }
    });
});

在这里演示:http://jsfiddle.net/7gcCz/2/

非常感谢任何建议。

【问题讨论】:

  • 这可能是 CR 的候选人 ...

标签: javascript underscore.js


【解决方案1】:

您可以使用_.filter_.where 的组合

_.filter(data, function(obj) {
    return _.where(obj.tax, {id: ID_TO_FIND}).length > 0;
})

查看演示:http://jsfiddle.net/hCVxp/

更新


感谢@GruffBunny。更有效的方法是使用_.some 来避免循环遍历所有tax 项:

var arr = _.filter(data, function(obj) {
    return _.some(obj.tax, {id: ID_TO_FIND});
});

查看演示:http://jsbin.com/putefarade/1/edit?html,js,console

【讨论】:

  • 第一次使用 underscore,第一个 Roadbump,Google 上的第一个链接,FTW!
  • 另外,如果 tax 只是一个对象,你必须把它放在一个数组中才能使这个东西起作用。像这样 _.some([obj.tax], {id: ID_TO_FIND});
【解决方案2】:

使用 _.filter 查找候选项目,并使用 _.some 检查集合中是否存在项目:

var filteredList = _.filter(list, function(item){
    return _.some(item.tax, { id: 17 });
});

【讨论】:

  • 我认为这个答案比上面接受的答案更有效。
  • 我可以在过滤器中使用 _.findWhere 吗?
【解决方案3】:

您可以单独使用 _.where 来做到这一点。

var filteredList  = _.where(list, { tax:[{id:17}] });

编辑:此方法适用于旧版本的 lodash,但不适用于当前的下划线或 lodash。 无论如何工作示例: https://jsfiddle.net/rhp4crma/

【讨论】:

  • 有人能告诉我为什么这被否决了吗?我对其进行了测试,它仅使用 1 个命令返回了 OP 要求的确切结果。
  • 我试过了,但它不起作用。尽管该项目存在,但我的返回 undefined
  • 正确的语法是:var filtersList = _.where(list, { tax:{id:17} });
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 2012-02-14
  • 2014-11-28
  • 2014-02-28
  • 2021-03-04
  • 1970-01-01
  • 2017-08-03
  • 2018-03-25
相关资源
最近更新 更多