将箭头样式函数转换为“函数”样式

问题描述 投票:2回答:6

我有这样的功能:

const jsonObject = {a: {b: 'c'}};
const x = 'a.b';
const properties = x.split('.');

const item = properties.reduce((obj, prop) => obj && obj[prop], jsonObject);

console.log(item); // prints 'c;

此函数动态遍历jsonObject并打印该值。

这样可以正常工作,但这种声明方式不支持我的环境。所以我想尝试将此转换为函数样式声明,如下所示:

const item = properties.reduce(function(obj, prop){
   if(obj && obj[prop]) return obj[prop];
});

但这似乎并没有奏效。它的打印(项目)未定义。

javascript angularjs ecmascript-6 lodash arrow-functions
6个回答
1
投票

工作片段

const jsonObject = {
  a: {
    b: 'c'
  }
};
const x = 'a.b';
const properties = x.split('.');

const item = properties.reduce(function(obj, prop) {
  return obj && obj[prop];
}, jsonObject);

console.log(item); // prints 'c;

说明

  1. Fat arrow(=>)返回默认情况下写在右侧的任何内容(即没有块作为正文)
  2. 在移植到函数表达式或声明时,我们需要显式使用return关键字。

3
投票
const item = properties.reduce((obj, prop) => obj && obj[prop], jsonObject);

类似于

const item = properties.reduce(function(obj, prop){
   return obj && obj[prop];
}, jsonObject);

阅读更多关于.reduce及其论点here


1
投票

是的,正确的翻译是:

function(obj, prop) {
    return obj && obj[prop];
}

1
投票

在你的代码中:

const item = properties.reduce(function(obj, prop){
  if(obj && obj[prop]) return obj[prop];
});

你永远不会将jsonObject作为第二个参数传递给函数,所以.reduce不知道要枚举什么。这样做的正确方法是:

const item = properties.reduce(function(obj, prop){
  if(obj && obj[prop]) return obj[prop];
}, jsonObject);

1
投票

一个很棒的在线工具BabelJs

它可以帮助您轻松地将ES6转换为ES5。但是,我建议了解它如何进行转换

   'use strict';

    var jsonObject = { a: { b: 'c' } };
    var x = 'a.b';
    var properties = x.split('.');

    var item = properties.reduce(function (obj, prop) {
      return obj && obj[prop];
    }, jsonObject);

    console.log(item);

1
投票

您可以添加默认值以防止对象中的非给定属性。

const item = properties.reduce(function (obj, prop){
        return (obj || {})[prop];
    }, jsonObject);
© www.soinside.com 2019 - 2024. All rights reserved.