代码之家  ›  专栏  ›  技术社区  ›  Dave

javascript:循环对象数组并将元素推到一个数组中

  •  2
  • Dave  · 技术社区  · 7 年前

    我试图循环遍历一个对象数组(data.list)并拉出一个元素(required\u fields.display\u value),然后将它们放入另一个数组并连接。

    我写了以下内容:

    c.data.required_fields = [];
                for(var i=0; i<c.data.list.length; i++) {
                    c.data.required_fields.push(
                        c.data.list[i].required_fields.display_value.split(',')             
                    );
                }
    

    返回以下内容:
    enter image description here

    我必须向上面的代码中添加什么,以便所需的\u字段是单个数组?谢谢

    6 回复  |  直到 7 年前
        1
  •  2
  •   Johan Karlsson    7 年前
    c.data.required_fields = [];
    for(var i=0; i<c.data.list.length; i++) {
        c.data.required_fields = c.data.required_fields.concat(
            c.data.list[i].required_fields.display_value.split(',')             
        );
    }
    

    这应该可以奏效。自从每次打电话到。split将返回一个数组,您需要将该数组的内容合并到required\u fields数组中。然而,Concat返回一个新的分支数组,因此“c.data.required\u fields=c.data.required\u fields.Concat…”分配

    **这是一个非常简单的修复。当然,您可以使用reduce做一些更具可读性的事情,但我相信另一个答案已经涵盖了这一点。

        2
  •  1
  •   Pabs123    7 年前

    问题是您正在为每个 list[i] 在一次操作中。这意味着您要将每个列表的所有元素添加到一个数组槽中,从而创建一个数组。

    您可以做的一件事是在

    c.data.require_field.flatten();

    另一种选择是在列表中单独插入每个条目,而不是一次将它们全部推入:

    for(var i=0; i<c.data.list.length; i++) {
       var list = c.data.list[i];
    
       //for each element in this list, add it to a new spot in the required_fields array
       for(var j=0; j<list.length){
          c.data.required_fields.push(
              c.data.list[j].required_fields.display_value.split(',')             
          );
       }                
    }
    

    第一个可能更简单、简洁,但为了明确到底出了什么问题,这里添加了第二个示例

        3
  •  0
  •   Johan Karlsson    7 年前

    如果要展平阵列,MDN上有一个代码段: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatten

    var arr1 = [1, 2, [3, 4]];
    arr1.flatten();
    
    //to flatten single level array
    arr1.reduce((acc, val) => acc.concat(val), []);
    // [1, 2, 3, 4]
    
        4
  •  0
  •   Canis djmayank    7 年前

    看起来您的值被拆分为一个新的数组,您不需要迭代来创建一维数组。我有两个建议。要么在循环中迭代拆分数组,要么先连接所有逗号分隔的字符串,然后再进行拆分。

    var dataArray = [];
    var list = c.data.list;
    
    list.forEAch(function(listItem){
      var values = listItem.required_fields.display_value.split(',');
      values.forEach(function(value){
        dataArray.push(value);
      });
    }
    
    c.data.required_fields = dataArray;
    

    或者可能:

    var values = "";
    var list = c.data.list;
    
    list.forEAch(function(listItem){
      if( !!values ) {
        values += ",";
      }
      values += listItem.required_fields.display_value;
    }
    
    c.data.required_fields = values.split(',');
    
        5
  •  -1
  •   fjc    7 年前

    要使代码正常工作,只需将其更改为

    c.data.required_fields = [];
            for(var i=0; i<c.data.list.length; i++) {
                Array.prototype.push.apply(c.data.required_fields,
                    c.data.list[i].required_fields.display_value.split(',')             
                );
            }
    

    就像那样,你打电话 Array push 方法打开 c.data.required_fields 并使用 c.data.list[i].required_fields.display_value.split(',') 作为单独的参数,而不是将被推送到另一个数组中的数组。

        6
  •  -1
  •   Muhammad Usman    7 年前

    您可以像这样简单地合并数组。

    将数组项与 , 。这将为您提供一个字符串 ,则, 作为分隔符,然后可以使用 ,则, 获取数组的步骤

    var r = [["Name","a","b"], ["Age","x","y"], ["hope","g","h"]];
    
    console.log(r.join(",").split(','))