在没有if的情况下循环js中的特定值

时间:2015-07-12 07:28:23

标签: javascript lodash

我使用下面的代码,它工作得很好,但我想知道在JS中是否有一种方法可以避免if和在循环中执行它,如果有帮助我也想使用lodash

for (provider in config.providers[0]) {
    if (provider === "save") {
        ....

6 个答案:

答案 0 :(得分:1)

您可以使用_.chainfilter按值将呼叫链接在一起,然后使用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;
&#13;
&#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>