下划线js按ID查找项目

Mau*_*o74 36 javascript underscore.js

我是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"
    }
    ...
]}
Run Code Online (Sandbox Code Playgroud)

这就是我正在尝试的,我想获得整个数组/对象,以便我可以得到它的每个字段:

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

知道怎么做吗?

Ahm*_*lfy 93

更新

这是2016年,我们可能不需要下划线才能实现这一目标.用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'
Run Code Online (Sandbox Code Playgroud)

浏览器支持

--------------------------------------------
| Chrome | Firefox | Safari |  IE  | Opera |
|--------|---------|--------|------|-------|
|   45   |    25   |  7.1   | Edge |  32   |
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

有关MDN上的polyfill的更多信息


更新:我发现_.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"
    }
]
Run Code Online (Sandbox Code Playgroud)

您可以使用以下内容:

var filteredGoal = _.where(goal, {id: "1"});
Run Code Online (Sandbox Code Playgroud)

  • 关于undersocre()的最好的事情是它的文档...我直接去了文档,搜索我需要的东西,如果它在那里我会找到它. (2认同)

Ved*_*Ved 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);
Run Code Online (Sandbox Code Playgroud)

要获取索引,您可以使用以下内容:

var b = _.indexOf(some,a);
console.log('index',b);
Run Code Online (Sandbox Code Playgroud)

如果需要所有使用列表,请执行
TRY: _. 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);
Run Code Online (Sandbox Code Playgroud)

_.find:它仅用于检查值,而不是Key-value.


访问文档:_.find


Gwy*_*ell 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);
Run Code Online (Sandbox Code Playgroud)

你可以在这个jsFiddle中看到这个.

  • 我喜欢这个答案,因为问题是要求返回一个项目,所以_.find()似乎比_.where()更合适.通常,当我传入ID时,我希望一个结果或零而不是一个可能的项目数组. (4认同)
  • 嘿Gwyn,jsfiddle链接很棒,但通常也是一个好主意,也包括帖子正文中的代码.如果jsfiddle链接永远打破,你的答案将对未来的访问者毫无用处.请考虑[编辑]将代码包含在正文中,以帮助确保在未来几年内帮助其他人.希望这可以帮助! (2认同)