【问题标题】:How to use lodash to find and return an object from Array?如何使用 lodash 从 Array 中查找并返回对象?
【发布时间】:2015-09-12 06:38:35
【问题描述】:

我的对象:

[
    {
        description: 'object1', id: 1
    },
    {
        description: 'object2', id: 2
    }
    {
        description: 'object3', id: 3
    }
    {
        description: 'object4', id: 4
    }
]

在下面的函数中,我传入描述以查找匹配的 ID:

function pluckSavedView(action, view) {
    console.log('action: ', action);
    console.log('pluckSavedView: ', view);  // view = 'object1'

    var savedViews = retrieveSavedViews();
    console.log('savedViews: ', savedViews);

    if (action === 'delete') {
        var delete_id = _.result(_.find(savedViews, function(description) {
            return description === view;
        }), 'id');

        console.log('delete_id: ', delete_id); // should be '1', but is undefined
    }
}

我正在尝试使用 lodash 的 find 方法:https://lodash.com/docs#find

但是我的变量 delete_id 未定义。


更新对于检查这个问题的人来说,Ramda 是一个很好的库,可以做与 lodash 相同的事情,但以更功能化的编程方式 :) http://ramdajs.com/0.21.0/docs/

【问题讨论】:

  • 我不清楚你为什么认为_.find 会神奇地将其中一个属性传递给回调。回调中的简单 console.log(description) 可能会告诉您。

标签: javascript arrays lodash


【解决方案1】:

你可以在 vanilla JS 中轻松做到这一点:

使用find:

const savedViews = [{"description":"object1","id":1},{"description":"object2","id":2},{"description":"object3","id":3},{"description":"object4","id":4}];

const view = 'object2';

const delete_id = savedViews.find(obj => {
  return obj.description === view;
}).id;

console.log(delete_id);

使用filter(原答案):

const savedViews = [{"description":"object1","id":1},{"description":"object2","id":2},{"description":"object3","id":3},{"description":"object4","id":4}];

const view = 'object2';

const delete_id = savedViews.filter(function (el) {
  return el.description === view;
})[0].id;

console.log(delete_id);

【讨论】:

  • 没错,但 lodash 看起来更干净,我不必使用 [0] 这是我要使用的解决方案 var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id'); 感谢您的演示 +1
  • 当你强制 [0] 输出一个空结果时它不会失败吗?所以 +1 到 @LeonGaban,Lodash 应该默认处理这个问题。
  • @LeonGaban 仍然可以在没有 [0] 的情况下使用 ES6 savedViews.find(el => el.description === view)
【解决方案2】:

使用

导入 lodash

$ npm i --save lodash

var _ = require('lodash'); 

var objArrayList = 
    [
         { name: "user1"},
         { name: "user2"}, 
         { name: "user2"}
    ];

var Obj = _.find(objArrayList, { name: "user2" });

// Obj ==> { name: "user2"}

【讨论】:

  • 添加更多细节
【解决方案3】:

为此在数组中查找给定的对象,_.find 的基本用法示例

const array = 
[
{
    description: 'object1', id: 1
},
{
    description: 'object2', id: 2
},
{
    description: 'object3', id: 3
},
{
    description: 'object4', id: 4
}
];

这会很好用

q = _.find(array, {id:'4'}); // delete id

console.log(q); // {description: 'object4', id: 4}

_.find 将有助于返回数组中的元素,而不是它的索引。因此,如果您有一个对象数组,并且您想通过某个键值对数组中的单个对象进行查找,那么 _.find 是适合该工作的工具。

【讨论】:

    【解决方案4】:

    根据名字获取id

     {
        "roles": [
         {
          "id": 1,
          "name": "admin",
         },
         {
          "id": 3,
          "name": "manager",
         }
        ]
        }
    
    
    
        fetchIdBasingOnRole() {
              const self = this;
              if (this.employee.roles) {
                var roleid = _.result(
                  _.find(this.getRoles, function(obj) {
                    return obj.name === self.employee.roles;
                  }),
                  "id"
                );
              }
              return roleid;
            },
    

    【讨论】:

      【解决方案5】:

      您不需要 Lodash 或 Ramda 或任何其他额外的依赖项。

      只需以函数式的方式使用 ES6 find() 函数:

      savedViews.find(el => el.description === view)
      

      有时您需要使用 3rd-party 库来获取它们附带的所有好东西。但是,一般来说,当您不需要依赖项时,请尽量避免它们。依赖项可以:

      • 增加捆绑代码大小,
      • 您必须让它们保持最新状态,
      • 它们可能会引入错误或安全风险

      【讨论】:

        【解决方案6】:

        传递给回调的参数是数组的元素之一。数组的元素是 {description: ..., id: ...} 形式的对象。

        var delete_id = _.result(_.find(savedViews, function(obj) {
            return obj.description === view;
        }), 'id');
        

        您链接到的文档中的另一种选择(lodash v3):

        _.find(savedViews, 'description', view);
        

        Lodash v4:

        _.find(savedViews, ['description', view]);
        

        【讨论】:

        • 谢谢!我刚刚发现这也有效var delete_id = _.result(_.find(savedViews, { 'description': view }), 'id'); 还有 10 分钟...
        • 第二种解决方法不对,谓词必须是数组才能使用matchesProperty简写:应该是_.find(savedViews, ['description', view])
        • @FranciscoGuimaraes:嗯,早在 2015 年,lodash 就是这样工作的:lodash.com/docs/3.10.1#find
        【解决方案7】:

        你可以使用下面的

        import { find } from 'lodash'
        

        然后使用以下命令从列表中返回整个对象(不仅是它的键或值):

        let match = find(savedViews, { 'ID': 'id to match'});
        

        【讨论】:

          【解决方案8】:

          lodash 和 ES5

          var song = _.find(songs, {id:id});
          

          lodash 和 ES6

          let song = _.find(songs, {id});
          

          文档https://lodash.com/docs#find

          【讨论】:

          • 在 find 方法中传递变量时,请确保将变量命名为与属性名称相同。就我而言,我在我的国家列表中寻找一个国家。 country 对象具有 code 和 name 属性。当我这样做时,const countryName = "Netherlands"; let country = _.find(countryList, {countryName}); undefined 被返回。当我使用const name = "Netherlands"; let country = _.find(countryList, {name}); 时,返回了正确的对象。
          【解决方案9】:
          var delete_id = _(savedViews).where({ description : view }).get('0.id')
          

          【讨论】:

            【解决方案10】:

            使用find 方法,您的回调将传递每个元素的值,例如:

            {
                description: 'object1', id: 1
            }
            

            因此,您需要如下代码:

            _.find(savedViews, function(o) {
                    return o.description === view;
            })
            

            【讨论】:

              猜你喜欢
              • 2016-08-10
              • 2015-01-04
              • 2017-03-13
              • 1970-01-01
              • 2013-03-27
              • 1970-01-01
              • 1970-01-01
              • 2011-01-19
              • 1970-01-01
              相关资源
              最近更新 更多