【问题标题】:Loop over each element in Object Arrays [duplicate]循环遍历对象数组中的每个元素[重复]
【发布时间】:2020-06-24 10:25:22
【问题描述】:

我有一个包含如下数据的对象,

obj = {
Q1:['val1','val2'],
Q2:['val3','val4','val5'],
Q3:['val8']
}

我试图遍历键并获取每个键中的第一个元素连接每个数组中的每个元素,并使用, 将它们连接在一起(我的对象有更多的键)

所以输出应该是这样的

  • val1,val3,val8
  • val2,val4,
  • ,val5,

我试图遍历键并获取每个值,但我认为我在循环中遗漏了一些东西,因为如果在每个对象中找到元素,我无法更改键

下面是我的试验。

for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
    for (let i = 0; i < obj[key].length; i++) {
          console.log(obj[key][i])//This is always looping on the same key but different element          
    }
  }
}

虽然我希望它接近

 for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
          console.log(obj[key][i])         
  }
}

【问题讨论】:

  • 能否请您详细说明您提到的输出描述?
  • 我想连接每个数组中的每个元素,因为我应该得到 val1 concat val3 concat val8 ,然后我将在它们之间使用 , 进行字符串连接,以便生成 val1,val3,val8 。 ...并且每当它在此数组中找不到值时(因为并非所有数组都相等,它应该只放置空白并执行 a ,因此它变为 val2,val4,''
  • @user120242 这是关于等长数组,但不幸的是这不是我的情况
  • 向下滚动。要模拟 zip,它还必须支持不等长数组。
  • 或者你说的是cartesian?你的输出实际上没有意义。

标签: javascript node.js object concatenation


【解决方案1】:

我的解决方案使用对象的深层副本,然后通过shift() 进行递归数组操作:

obj = {
  Q1:['val1','val2'],
  Q2:['val3','val4','val5'],
  Q3:['val8']
}

var resObj = [];

function printByIndex(obj){
  var newObj = JSON.parse(JSON.stringify(obj));
  printByIndexHelper(newObj, 0);
}

function printByIndexHelper(obj, i){
  var flag = false;
  resObj[i] = [];
  Object.keys(obj).forEach(function(key){
    if(obj[key].length > 0){
      resObj[i].push(obj[key].shift());
      if(obj[key].length > 0){
        flag = true;
      }
    }else{
     resObj[i].push(null);
     }
  });
  if(flag){
    printByIndexHelper(obj, i+1);
  }
}

printByIndex(obj);
console.log(resObj);

【讨论】:

    【解决方案2】:

    映射数组并连接字符串。 Math.max 以获取完整长度以进行迭代。使用 flatMap 过滤掉长度不等的数组值。

    obj = {
    Q1:['val1','val2'],
    Q2:['val3','val4','val5'],
    Q3:['val8']
    }
    
    const o = Object.values(obj)
    const len = Math.max(...o.map(({length})=>length))
    console.log(
    Array(len).fill().map((x,i)=>o.flatMap(q=>q[i]||[]).join(','))
    )

    【讨论】:

      【解决方案3】:

      检查与您要求相同的输出

       obj = {
          Q1:['val1','val2'],
          Q2:['val3','val4','val5'],
          Q3:['val8']
          }
          
          var keys = Object.keys(obj);
          var stack = [];
          var maxLength = getMaxLength(obj);
          
            for(var k = 0; k < 3;k ++) {
                var arr = [];
              
              for(var i = 0; i<keys.length;i++) {
                const key = keys[i];
                const elements = obj[key];
          
                  if(k < elements.length) {
                    arr.push(elements[k]);  
                  }
              }
          
                  console.log(arr+"\n");
              //stack.push(arr);
          }
          
          
          function getMaxLength(jsonObj) {
            var max;
            var jsonKeys = Object.keys(jsonObj);
            for(var key of jsonKeys) {
              const arr = jsonObj[key];
              if (max == null || arr.length > max) {
                max = arr.length;  
              } 
            }
            return max;
          }

      【讨论】:

      • 你能解释一下吗?
      • 1.从数组中的对象获取键 var objArray = Object.keys(obj) 2.get keys 数组(objArray 的var key) 3.join 字符串中的数组 var str = elements.join(",");
      • 这只是连接每个值数组
      • 答案不符合OP的要求
      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 2012-01-04
      • 2021-07-31
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2016-07-08
      相关资源
      最近更新 更多