2017-08-08 131 views
-1

我试图循环对象数组通过以下:通过循环使用javascript

{ 
    "machine": [{ 
     "cost_center": "15023 DC1 M3 - Hassia1", 
     "item": [{ 
      "batchno": "367721", 
      "itemno": "12028" 
     }, { 
      "batchno": "367722", 
      "itemno": "12328" 
     }, { 
      "batchno": "367723", 
      "itemno": "12608" 
     }] 
    }, { 
     "cost_center": "15033 DC1 M4 - Hamba", 
     "item": [{ 
      "batchno": "367729", 
      "itemno": "11850" 
     }, { 
      "batchno": "367730", 
      "itemno": "11851" 
     }, { 
      "batchno": "367731", 
      "itemno": "11852" 
     }] 
    }, { 
     "cost_center": "15043 DC1 M5 - 1KG Machine", 
     "item": { 
      "batchno": "367732", 
      "itemno": "12592" 
     } 
    }] 
} 

var json = '{"machine":[{"cost_center":"15023 DC1 M3 - Hassia1","item":[{"batchno":"367721","itemno":"12028"},{"batchno":"367722","itemno":"12328"},{"batchno":"367723","itemno":"12608"}]},{"cost_center":"15033 DC1 M4 - Hamba","item":[{"batchno":"367729","itemno":"11850"},{"batchno":"367730","itemno":"11851"},{"batchno":"367731","itemno":"11852"}]},{"cost_center":"15043 DC1 M5 - 1KG Machine","item":{"batchno":"367732","itemno":"12592"}}]}'; 
 

 
var obj = JSON.parse(json); 
 
var db = obj.machine; 
 

 
for (var m in db) { 
 
    if (db.hasOwnProperty(m)) { 
 
     var item = db[m].item; 
 
     console.log('cost_center ' + m + ' = ' + db[m].cost_center); 
 
     for (var i in item) { 
 
      if (item.hasOwnProperty(i)) { 
 
       var prod = item[i]; 
 
       console.log('-itemno ' + i + ' ' + prod.itemno); 
 
      } 
 
     } 
 
    } 
 
}

我也发现了类似的问题here但不同的躺在我的数据,我的前两个cost_centers有数组作为元素,我的第三个不是数组。

COST_CENTER 0 = 15023 DC1 M3 - Hassia1
-itemno 0 12028
-itemno 1 12328
-itemno 2 12608
COST_CENTER 1 = 15033 DC1 M4 - Hamba
-itemno 0 11850
-itemno 1 11851
-itemno 2 11852
COST_CENTER 2 = 15043 DC1 M5 - 1KG机
-itemno batchno未定义
-itemno itemno undefined

如何遍历所有内容并仍然从cost_center中获取所有不包含数组的值? 谢谢

+0

你或许应该提到所需的输出,使人们能够帮助并看看你做错了什么。 –

+0

如果您运行代码,您可以通过执行一些'if' – Muhaimin

+0

来重复其中的对象循环,您可以真正看到我在说什么。但我会编辑这个问题。谢谢@AnuragSinghBisht – Jonathan

回答

1

无需hasOwnPropertyitem.constructor === Array可以用来检查:

var db = JSON.parse('{"machine":[{"cost_center":"15023 DC1 M3 - Hassia1","item":[{"batchno":"367721","itemno":"12028"},{"batchno":"367722","itemno":"12328"},{"batchno":"367723","itemno":"12608"}]},{"cost_center":"15033 DC1 M4 - Hamba","item":[{"batchno":"367729","itemno":"11850"},{"batchno":"367730","itemno":"11851"},{"batchno":"367731","itemno":"11852"}]},{"cost_center":"15043 DC1 M5 - 1KG Machine","item":{"batchno":"367732","itemno":"12592"}}]}').machine; 
 

 
for (var m = 0; m < db.length; m++) 
 
{ 
 
    var e = db[m], item = e.item; 
 
    console.log('cost_center ' + m + ' = ' + e.cost_center); 
 

 
    if (item.constructor === Array) 
 
    for (var i = 0; i < item.length; i++) 
 
     console.log(' itemno ' + i + ' = ' + item[i].itemno); 
 
    else 
 
    console.log(' itemno 0 = ' + item.itemno); 
 
}

+0

构造函数是做什么的?为什么你的if语句在没有关闭的情况下工作? – Jonathan

+1

@Jonathan [它将变量构造函数与数组构造函数进行比较](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor)。 Suposely它是[检查变量是否是数组]的最快方法(https://stackoverflow.com/questions/767486/how-do-you-check-if-a-variable-is-an-array-in-javascript )。大括号是可选的一个语句(不是一行)https://stackoverflow.com/questions/7117873/do-if-statements-in-javascript-require-curly-braces – Slai

+0

谢谢!我真的很感激 – Jonathan

1

而不是使用for-in来遍历数组,您可以使用forEach属性。另外,如果你的最后一个元素不包含一个数组,我假设它总是一个对象。所以要测试一下,你可以检查数组的length。如果存在length比它是一个数组,你可以循环获得答案。如果不是那么它是一个对象,所以你可以直接打印值。

var json = '{"_vger_record_id":"2409247","ExtraData":"","machine":[{"_vger_record_id":"2409248","cost_center":"15023 DC1 M3 - Hassia1","ExtraData":"","item":[{"_vger_record_id":"2409249","batchno":"367721","itemno":"12028"},{"_vger_record_id":"2409250","batchno":"367722","itemno":"12328"},{"_vger_record_id":"2409251","batchno":"367723","itemno":"12608"}]},{"_vger_record_id":"2409257","cost_center":"15033 DC1 M4 - Hamba","ExtraData":"","item":[{"_vger_record_id":"2409258","batchno":"367729","itemno":"11850"},{"_vger_record_id":"2409259","batchno":"367730","itemno":"11851"},{"_vger_record_id":"2409260","batchno":"367731","itemno":"11852"}]},{"_vger_record_id":"2409261","cost_center":"15043 DC1 M5 - 1KG Machine","ExtraData":"","item":{"_vger_record_id":"2409262","batchno":"367732","itemno":"12592"}}]}'; 
 

 
var obj = JSON.parse(json); 
 
var db = obj.machine; 
 

 

 
db.forEach(function(m) { 
 
    console.log('cost_center = ' + m.cost_center); 
 
    if(m.item.length) { 
 
    m.item.forEach(function(i) { 
 
     console.log('-itemno = ' + i.itemno); 
 
    }); 
 
    } else { 
 
    console.log('-itemno = ' + m.item.itemno); 
 
    } 
 
    
 
});

+0

谢谢,对于ForEin,每个方法都有哪些优势? – Jonathan

+1

不是一个安全的测试本身......可以是一个没有长度的空数组 – charlietfl

+0

它是一个数组的实用工具,通过它可以轻松地遍历数组。 'for -in'对于这个目的没有用 –