使用Underscore.js按ID查找项目

42

我是Underscore.js的新手,有些困惑如何使用它。我有一个“目标”集合,我想通过ID查找其中一个。

这是数据:

{"goal":[
    {
        "category" : "education",
        "title" : "Charlie University",
        "description" : "Lorem ipsum dolor sit amet",
        "date" : "01/03/2020",
        "value" : 50000,
        "achievability" : 3,
        "experimental_achievability": 3,
        "suggested": false,
        "accounts": [
            {
                ...
            },
            {
                ...
            }
        ],
        "articles": [
            {
                ...
            },
            {
                ...
            },
            {
                ...
            }
        ],
        "related_goals": [
            {
                ...
            }
        ],
        "id":"1"
    },
    {
        "category" : "family",
        "title" : "Getting married",
        "description" : "Lorem ipsum dolor sit amet",
        "date" : "01/03/2022",
        "value" : 10000,
        "achievability" : 3,
        "experimental_achievability": 2,
        "suggested": true,
        "accounts": [
            {
                ...
            }
        ],
        "articles": [
            {
                ...
            },
            {
                ...
            },
            {
                ...
            }
        ],
        "related_goals": [
            {
                ...
            }
        ],
        "id":"2"
    }
    ...
]}

这就是我的尝试,我想获取整个数组/对象,以便能够获取其中每个字段:

var goalId = 1;
_.each(result.goal, function(item){
    _.find(result.goal, function(i){
         return i = goalId;
    });
});

有什么想法如何完成它?


请参阅Underscore.js文档, 网址:http://underscorejs.org/#findWhere - Mohammed Safeer
3个回答

99

更新

现在是2016年,我们实际上可能不需要underscore来实现这一点。可以使用Array.prototype.find()方法。它返回数组中满足提供的测试函数的元素的值。否则返回undefined。

  // Underscore
  var users = [
    { 'user': 'barney',  'age': 36, 'active': true },
    { 'user': 'fred',    'age': 40, 'active': false },
    { 'user': 'pebbles', 'age': 1,  'active': true }
  ]

  _.find(users, function (o) { return o.age < 40; })
  // output: object for 'barney'

  // Native
  var users = [
    { 'user': 'barney',  'age': 36, 'active': true },
    { 'user': 'fred',    'age': 40, 'active': false },
    { 'user': 'pebbles', 'age': 1,  'active': true }
  ]

  users.find(function (o) { return o.age < 40; })
  // output: object for 'barney'

浏览器支持

--------------------------------------------
| Chrome | Firefox | Safari |  IE  | Opera |
|--------|---------|--------|------|-------|
|   45   |    25   |  7.1   | Edge |  32   |
--------------------------------------------
更多关于polyfill的信息,请参考MDN
更新: 我发现_.where总是返回一个数组。_.findWhere返回它找到的第一个对象,因此在期望返回单个对象时使用它更好。
你可以使用_.where,它更容易操作。 如果代码类似于:
var goal  = [

    {
        "category" : "education",
        "title" : "Charlie University",
        "description" : "Lorem ipsum dolor sit amet",
        "date" : "01/03/2020",
        "value" : 50000,
        "achievability" : 3,
        "experimental_achievability": 3,
        "suggested": false,
        "accounts": [],
        "articles": [],
        "related_goals": [],
        "id":"1"
    },
    {
        "category" : "education",
        "title" : "Charlie University",
        "description" : "Lorem ipsum dolor sit amet",
        "date" : "01/03/2020",
        "value" : 50000,
        "achievability" : 3,
        "experimental_achievability": 3,
        "suggested": false,
        "accounts": [],
        "articles": [],
        "related_goals": [],
        "id":"2"
    },
    {
        "category" : "education",
        "title" : "Charlie University",
        "description" : "Lorem ipsum dolor sit amet",
        "date" : "01/03/2020",
        "value" : 50000,
        "achievability" : 3,
        "experimental_achievability": 3,
        "suggested": false,
        "accounts": [],
        "articles": [],
        "related_goals": [],
        "id":"3"
    },
    {
        "category" : "education",
        "title" : "Charlie University",
        "description" : "Lorem ipsum dolor sit amet",
        "date" : "01/03/2020",
        "value" : 50000,
        "achievability" : 3,
        "experimental_achievability": 3,
        "suggested": false,
        "accounts": [],
        "articles": [],
        "related_goals": [],
        "id":"4"
    }
]
你可以使用类似以下的代码:

You can use something like :

var filteredGoal = _.where(goal, {id: "1"});

1
没错 - 比我的解决方案更好! - Gwyn Howell
2
underscore() 最好的一点就是它的文档...我直接前往文档,搜索我需要的内容,如果有,我就能找到它。 - Ahmad Alfy
我也是。坏习惯吧,总是使用同样的函数。但感谢您指出了 _.where() 的有用性,我将在以后牢记它。 - Gwyn Howell
.findWhere 是我需要的更简洁的解决方案。谢谢。 - TWright
Underscore的_.findWhere能否处理子属性,就像Lodash的_.find一样?(https://lodash.com/docs#find)这样我就可以搜索chr.age < 40了,例如。 - Predrag Stojadinović

21

您正在使用对象数组。因此,您可以使用:_.findWhere(查找列表并返回与所有键值对匹配的第一个值)来获取基于id或其他关键属性的所有属性。

var some= [
             {Employee:'ved',id:20}, 
             {Employee:"ved",age:25},
             {Employee:"p",age:2}
          ];

var a = _.findWhere(some,{id:20});
console.log('searchResult',a);
为了获取索引,您可以使用类似以下方式的代码:
var b = _.indexOf(some,a);
console.log('index',b);
如果你需要列出所有用途, 请尝试:_.where(它会查找数组中的每个元素,返回一个包含属性键值对的所有值的数组)。
var some= [ 
            {Employee:"ved",id:20}, 
            {Employee:"ved prakash",id:20},
            {Employee:"anyone",id:2}
          ];
var a = _.where(some,{id:25});
    console.log('searchResult',a);

_.find:用于检查值,而不是键值对。


访问文档:_.find


15

您简化了数据模型,但是否类似于这样?

var goals = [{id:1, name:'Goal1'},
             {id:2, name:'Goal2'},
             {id:3, name:'Goal3'}];

function getGoal(id) {
    return _.find(goals, function(goal) {
        return goal.id === id;
    });
}

alert(getGoal(2).name);

您可以在这个jsFiddle中亲自尝试。

4
我喜欢这个答案,因为问题要求返回一个单一的项目,所以使用 _.find() 比 _.where() 更合适。通常当我传入一个 ID 时,我期望要么返回一个结果,要么返回零个结果,而不是可能是一个项目数组。 - kaelle
2
嘿,Gwyn,jsfiddle链接很棒,但通常最好也在帖子正文中包含代码。如果jsfiddle链接出现问题,您的答案将对未来的访问者毫无用处。请考虑进行[编辑],在正文中包含代码,以确保此帮助能够持续多年。希望这可以帮到您! - jamesmortensen
1
感谢您的编辑!我已经为您添加回jsFiddle链接。这仍然是有帮助和有用的,但现在人们可以决定是否需要更多信息,如果需要,可以点击链接或者只是查看页面上的内容。简而言之,链接仍然很棒,只是不能单独存在。 :) - jamesmortensen

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