【问题标题】:How to map a dictionary in reactJS?如何在 reactJS 中映射字典?
【发布时间】:2016-02-04 02:19:43
【问题描述】:

我从在线 api 以 {{key: object}, {key: object},... For like 1000 Objects} 的形式获取字典。我想用 reactJS 做类似的事情

this.props.dict.map(function(object, key)){
 //Do stuff
}

此映射适用于数组,但显然不适用于字典。我怎样才能实现类似的目标?

【问题讨论】:

  • 那是对象的对象吗?还是一组对象?还是一个带有一堆指向对象的键的对象?

标签: javascript reactjs


【解决方案1】:

如果您针对现代浏览器或使用某种转译器,您可以使用Object.entries 在单次迭代中映射[key, value] 对。

const obj = {
  foo: 'bar',
  baz: 42
}

console.log('Object.entries')
console.log(
  Object.entries(obj)
)

console.log('Mapping')
console.log(
  Object.entries(obj)
  .map( ([key, value]) => `My key is ${key} and my value is ${value}` )
)

与 React 一起使用

Object.entries 函数在 React 中非常方便,因为默认情况下对象/字典没有简单的迭代。 React 要求您在迭代时为组件分配键以执行其差异算法。通过使用Object.entries,您可以利用已经键控的集合,而无需在数据中手动注入键或使用数组索引,这可能会导致在过滤、删除或添加项目后索引发生变化时出现不良行为。

请看下面的 Object.entries 使用 React 的例子:

const buttonCaptions = {
  close: "Close",
  submit: "Submit result",
  print: "print",
}

const Example = () =>
  <div>
  {
    Object.entries(buttonCaptions)
    .map( ([key, value]) => <button key={key}>{value}</button> )
  }
  </div>

ReactDOM.render(<Example />, document.getElementById('react'));
<div id="react"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

常见语法错误

附带说明,请记住,在映射Object.entries 的结果时,在使用数组解构时必须将数组参数包装在括号中。以下代码将抛出语法错误:

console.log(
  Object.entries({key: 'value'})
  .map([key, value] => `${key}: ${value}`)
)

改为这样做:

console.log(
  Object.entries({key: 'value'})
  .map( ([key, value]) => `${key}: ${value}` )
)
    
console.log(
  Object.entries({key: 'value'})
  .map(keyValuePair => `${keyValuePair[0]}: ${keyValuePair[1]}`)
)

兼容性

对于当前浏览器的支持,请参见ECMAScript compatibility table 2017 features > Object static methods。

【讨论】:

    【解决方案2】:

    Javascript 中的“字典”被称为对象,您可以通过与数组非常相似的方式对它们进行迭代。

    var dict = this.props.dict;
    
    for (var key in dict) {
      // Do stuff. ex: console.log(dict[key])
    }
    

    如果您正在考虑使用 map 以便在迭代结束时拥有一个完整的数组,那么在您的 for..in 循环中,您可以推送到您之前声明的数组。

    var dict = this.props.dict;
    var arr = [];
    
    for (var key in dict) {
      arr.push(dict[key]);
    }
    

    【讨论】:

      【解决方案3】:

      如果您想像往常一样使用map,一个选项是Object.getOwnPropertyNames()

      var newArr = Object.getOwnPropertyNames(this.props.dict).map(function(key) {
          var currentObj = this.props.dict[key];
          // do stuff...
          return val;
      });
      

      【讨论】:

        【解决方案4】:

        假设您的意思是:{key: object, key2: object}

        您可以执行类似的操作(不确定与 getOwnPropertyNames 的确切差异,但应该执行相同的操作,可能性能较差):

        Object.keys(this.props.dict)
            .map(function(key)){ 
                 var object = this.props.dict[key]
                 //Do stuff
             })
        

        编辑:

        如果您只想要对象的可枚举,请使用Object.keys

        【讨论】:

          猜你喜欢
          • 2016-11-15
          • 1970-01-01
          • 2020-06-13
          • 2020-09-18
          • 2021-09-16
          • 1970-01-01
          • 2021-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多