【问题标题】:Javascript/Lodash/Redux - return object with specific id from an objectJavascript/Lodash/Redux - 从对象返回具有特定 id 的对象
【发布时间】:2018-04-11 05:59:18
【问题描述】:

假设我们有一个对象:

names:
    {
     0: {"id": 30, name: "Adam"},
     1: {"id": 1, name: "Ben"},
     2: {"id": 15, name: "John"},
     ...
    }

并使用 lodash get 函数我想将特定名称保存到常量中。

const name = _.get(state, ['names', nameId]);

我知道这行不通,因为我选择的是对象的键而不是 id。知道如何解决吗?请注意,我不能像使用 id 作为对象的键一样对数据进行规范化,因为它破坏了这些数据来自 BE 的顺序。是否可以遍历对象并查找特定的 id ?

我从其他函数中正确获取了nameId

【问题讨论】:

  • 答案是否必须使用 lodash?
  • 您的意思是要将名称关联的对象保存到常量中吗?
  • 不,它不必使用 lodash
  • 如果 nameId 是 30,那么 name 常量应该有 {"id": 30, name: "Adam"} 在里面

标签: javascript json reactjs redux lodash


【解决方案1】:

您可以使用_.find()_.values() 通过id 获取特定对象。

var state = {names:{
  0: {"id": 30, name: "Adam"},
  1: {"id": 1, name: "Ben"},
  2: {"id": 15, name: "John"},
}}

var r = _.find(_.values(state.names), {id: 1})
console.log(r)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    不需要 Lodash。只需遍历对象的属性,在 id 上寻找匹配项:

    const names = {
     0: {"id": 30, name: "Adam"},
     1: {"id": 1, name: "Ben"},
     2: {"id": 15, name: "John"}
    };
    const nameId = 1;
    let obj;
    for (const name in names) {
      if (names[name].id == nameId) {
        obj = names[name];
        break;
      }
    }
    console.log(obj);

    或使用Object.keyssome,但除了跳过继承的属性之外,它并没有真正为你买任何东西:

    const names = {
     0: {"id": 30, name: "Adam"},
     1: {"id": 1, name: "Ben"},
     2: {"id": 15, name: "John"}
    };
    const nameId = 1;
    let obj;
    Object.keys(names).some(name => {
      if (names[name].id == nameId) {
        obj = names[name];
        return true;
      }
    });
    console.log(obj);

    或者使用 ES2017 的 Object.values(对于旧环境很容易填充)find

    const names = {
     0: {"id": 30, name: "Adam"},
     1: {"id": 1, name: "Ben"},
     2: {"id": 15, name: "John"}
    };
    const nameId = 1;
    const obj = Object.values(names).find(entry => entry.id == nameId);
    console.log(obj);

    【讨论】:

      【解决方案3】:

      试试这个简单的方法

      var output = Object.values( obj.names ).find( function( item ){ return item.id = inputId }).name;
      
      • 使用Object.values迭代对象值的数组

      • 使用find通过id比较来获得特定值

      • 获取返回对象的name属性。

      演示

      var obj = {
          names: {
              0: {"id": 30, name: "Adam"},
              1: {"id": 1, name: "Ben"},
              2: {"id": 15, name: "John"}
          }
      };   
      var inputId = 15;
      console.log( Object.values( obj.names ).find( function( item ){ return item.id = inputId }).name );

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        相关资源
        最近更新 更多