我有这样的功能:
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];
});
但这似乎并没有奏效。它的打印(项目)未定义。
工作片段
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;
说明
return
关键字。const item = properties.reduce((obj, prop) => obj && obj[prop], jsonObject);
类似于
const item = properties.reduce(function(obj, prop){
return obj && obj[prop];
}, jsonObject);
阅读更多关于.reduce及其论点here
是的,正确的翻译是:
function(obj, prop) {
return obj && obj[prop];
}
在你的代码中:
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);
一个很棒的在线工具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);
您可以添加默认值以防止对象中的非给定属性。
const item = properties.reduce(function (obj, prop){
return (obj || {})[prop];
}, jsonObject);