2016-08-24 83 views
0
var a = { 
    "errors":{ 
    "meters.electric":[ 
     {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]} 
    ], 
    "forename":[ 
     {"invalid_character":["Invalid character in forname.", "Blah blah."]} 
    ] 
    } 
}; 

我有一个对象从API返回,我需要提取结束值来创建单个字符串。从上面的预期输出owuld是:使用lodash提取混合对象/数组的叶子

The smart meter field is required. The selected reading is invalid.Invalid character in forname. Blah blah. 

我知道我可以建立一系列的循环来实现这一点,但有一个lodash方式?东西沿着https://lodash.com/docs#flattenDeep

+1

你能不能给更广泛的例子吗?你想要它与对象中的其他属性做什么?你是否想要.toString并且连接原始树中的每个属性?或者也许只有那些是字符串? –

+0

我已经为对象添加了几个部分并扩展了这个句子。 Bascially,是的,我只想为视图的错误字符串,并开始第一次使用lodash .. – John

回答

1

请允许我用一些组合物来吸引你。

在连接字符串之前,您可能需要一个可从任意复杂度的对象/数组中提取值的泛型函数。这里是你会如何使用现有的lodash积木组成这个功能:

const flattenCol = _.flow(
    _.identity, 
    _.partialRight(_.map, _.cond([ 
    [_.isArray, flattenCol], 
    [_.isPlainObject, flattenCol], 
    [_.stubTrue, _.identity], 
    ])), 
    _.flattenDeep 
); 

这将提取所有的值从结构,在这种情况下,字符串。让我们打破这:

我发现保持这种通用的功能是超级有用的。要建立您的字符串,你可以做:

flattenCol(a).join(' '); 

或者,如果你想保持党的成分会:

const errorString = _.flow(flattenCol, _.partialRight(_.join, ' ')); 
errorString(a); 
2

这是一个有点可笑寻找,但它的工作原理:通过治疗阵列

var a = { 
    "errors":{ 
    "meters.electric":[ 
     {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]} 
    ], 
    "forename":[ 
     {"invalid_character":["Invalid character in forname.", "Blah blah."]} 
    ] 
    } 
}; 

function flattenStrings(obj) { 
    if (typeof obj != 'object') { 
    return obj.toString(); 
    } 
    return Object.keys(obj).map(function(key) { 
    return flattenStrings(obj[key]); 
    }).join(""); 
} 

console.log(flattenStrings(a)); 

注和:

var flattenStrings = _.flatMap(_.flatMap(a.errors), function (i) { 
    return _.flatMap(i); 
}); 

_.join(flattenStrings, ' ') 

Example

+0

哈生病了。我知道会有这样的事情,谢谢! – John

1

对于比较lodash,这里是用香草的JavaScript的方法普通对象和使用Object.keys(),数组的索引不保证以稳定的顺序命中,所以它有可能在不同浏览器上的同一对象上运行此命令可能会以不同方式对字符串进行串联。

你可以用一些额外的代码解决这个问题,但在这里并没有看到重要的东西。

+0

确实,但是我现在试图让我的头进入lodash,这是一个小的lib当压缩,我开始认为这将是值得的长期运行 – John

+1

是的,不是要告诉你不要使用如果你想要的话,请点一下!我个人发现看到这两个并排,对上下文有帮助,所以我想其他人也可能。 –