【问题标题】:javascript foreach return results containing namejavascript foreach 返回包含名称的结果
【发布时间】:2014-11-30 07:42:43
【问题描述】:

我有下面的 javascript,它返回每个项目的 name1 值。

var data = [{"name1": "aaa", "name2":"bbb", "other":"ccc"},{"name1": "ddd", "name2":"eee", "other":"fff"}];

function logArrayElements(element, index, array) {
  contName = element.name1;
  console.log('a[' + index + '] = ' + contName);
}

data.forEach(logArrayElements);

//returns below in console
a[0] = aaa 
a[1] = ddd 

我想返回包含每个项目名称的所有值。 我可以通过添加来做到这一点

contName2 = element.name2;
console.log('a[' + index + '] = ' + contName);

但是我不想列出它,因为在不同的场合我会有不同数量的“名字”。 我知道在搜索字符串时我可以执行以下操作,但无法弄清楚如何处理类似于我上面的内容?

var myName = "name2";
console.log(myName.indexOf("name") > -1);

【问题讨论】:

    标签: javascript html foreach


    【解决方案1】:

    我知道我在游戏中有点晚了,但我只是想使用 lodash 添加另一个替代方案。

    var data = [{
      "name1": "aaa",
      "name2": "bbb",
      "other": "ccc"
    }, {
      "name1": "ddd",
      "name2": "eee",
      "other": "fff"
    }];
    
    function getFields(data, expression) {
      var re = new RegExp(expression, "i");
      
      return _.reduce(data, function(result, object) {
        return _.union(result, _.reduce(object, function(list, value, key) {
            if (re.test(key)) {
              return _.union(list, [value]);
            } else {
              return list;
            }
        }, []));
      }, []);
    }
    
    alert(getFields(data, '^name'));
    alert(getFields(data, '^other'));
    <script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.js"></script>

    上面的这个函数将所有找到的名字作为一个数组返回。该函数接受两个参数:要搜索的数组和用于匹配要返回的值的键名的正则表达式。

    【讨论】:

      【解决方案2】:

      您可以使用array.filter,然后像这样遍历数组中的每个对象:

      var myArray = [
          {"name1": "aaa", "name2":"bbb", "other":"ccc"},
          {"name1": "ddd", "name2":"eee", "other":"fff"}
      ];
      
      myArray.filter(function(row){
      
          for( key in row ){
      
              if( key.indexOf('name') === 0 ){ // only matches keys **starting** with "name"
      
                  console.log( 'a[' + key + '] = ' + row[key] );
      
              }
      
          }
      
      });
      

      【讨论】:

      • 这也会得到一个名为 briname 的键(我刚刚发明了这个词)。
      • 他说的是“包含名称”,但他可能是指你所说的。已修复,谢谢 :)
      • 看起来不错,谢谢,是否可以将其添加为变量以供重用?例如,我尝试将 name 替换为名为 myName = "name"; 的 var。看小提琴,但它不像你的例子那样返回结果? jsfiddle.net/08qxxm50
      • @ak85 您的小提琴不起作用,因为您将 myFilter 作为参数添加到 array.filter,因此它将在过滤器的范围内被覆盖。由于您在函数外部声明 myFilter,它将在 array.filter 中可用。见jsfiddle.net/o6ovrnft
      【解决方案3】:

      这就是我要做的。

      我会遍历您的对象的键以查找以“名称”开头的那些:

      function logArrayElements(element, index, array) {
        for(var i in element){
            if(i.indexOf('name') === 0){
                contName = element[i];
                console.log('a[' + index + '] = ' + contName);
            }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        • 2017-11-06
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        相关资源
        最近更新 更多