我使用下面的代码,它工作得很好,但我想知道在JS中是否有一种方法可以避免if和在循环中执行它,如果有帮助我也想使用lodash
for (provider in config.providers[0]) {
if (provider === "save") {
....
答案 0 :(得分:1)
您可以使用_.chain
,filter按值将呼叫链接在一起,然后使用each为每个过滤结果调用一个函数。但是,您必须在最后添加最终.value()
调用,以便评估您刚刚构建的表达式。
我认为,对于简短的条件块,if
语句更容易,更易读。如果你要在一个对象或集合上组合多个操作或执行复杂的过滤,排序等,我会使用lodash-更具体地说是链接。
var providers = ['hello', 'world', 'save'];
_.chain(providers)
.filter(function(provider) {
return provider === 'save';
}).each(function(p) {
document.write(p); // your code here
}).value();

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.8.0/lodash.js"></script>
&#13;
编辑:我的错误; filter
没有超载,只能提供文字值。如果你想进行字面值检查,你必须提供一个函数,如上面修改的答案。
答案 1 :(得分:1)
基本上,您正在测试以查看作为对象的config.providers[0]
是否包含名为save
的属性(或其他一些动态值,我使用名为{{1的变量)将该值存储在下面的示例代码中。)
您可以使用此代替使用provider
循环:
for .. in ..
或使用@ initialxy&#39; s(更好!)建议:
var provider = 'save';
if (config.providers[0][provider] !== undefined) {
...
}
答案 2 :(得分:1)
我认为你所拥有的东西非常好,干净且易读,但既然你提到了lodash,我会试一试。
public static void main(String[] args) throws Exception{
DocumentTemplateFile obj = (DocumentTemplateFile)unmarshal(DocumentTemplateFile.class, new InputSource("sample.xml"));
// obj.data refers to File which contains base64 encoded data
}
请注意,ECMAScript 6的箭头函数/ lambda在版本45之前不会进入Chrome。
答案 3 :(得分:0)
怎么样:
for (provider in config.providers[0].filter(function(a) {return a === "save"}) {
...
}
答案 4 :(得分:0)
策略,您正在寻找某种策略模式,
Currenlty拯救是硬编码的,但如果来自其他变量,你会怎么做 - Al Bundy
var actions = {
save: function() {
alert('saved with args: ' + JSON.stringify(arguments))
},
delete: function() {
alert('deleted')
},
default: function() {
alert('action not supported')
}
}
var config = {
providers: [{
'save': function() {
return {
action: 'save',
args: 'some arguments'
}
},
notSupported: function() {}
}]
}
for (provider in config.providers[0]) {
(actions[provider] || actions['default'])(config.providers[0][provider]())
}
按“运行代码段”按钮将显示两个弹出窗口 - 小心
答案 5 :(得分:0)
原发帖者没有明确说明是否需要输出 应该是一个single save - 或者一个包含所有出现的数组 保存。
这个答案显示了后一种情况的解决方案。
const providers = ['save', 'hello', 'world', 'save'];
const saves = [];
_.forEach(_.filter(providers, elem => { return elem==='save' }),
provider => { saves.push(provider); });
console.log(saves);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.19/lodash.js"></script>