Array 的長度,PHP和JS的差別
Array 的長度,PHP和JS的差別

Array 的長度,PHP和JS的差別

今天意外發現自己寫的bug,查了以後發現就是因為比較習慣了PHP的用法,無意間就自己挖了一個坑(?)

前情提要一下,目前的環境有要求我們將型態帶在變數前面

一般我們常用PHP增加資料到Array的方式

$arrData = [];
foreach ($arrDataSource as $key => $value) {
    $arrData[$key] = $value;
}

又或是

$arrData = [];
foreach ($source as $value) {
    $arrData[] = $value;
}

這兩個出來的差別

["key1" => "value1", "key2" => "value"...]

["value1","value2"......]

當我們需要知道陣列長度的時候,就是快樂的count即可

echo count($arrData);

於是我寫JS的時候,做了以下的事情

let arr = [];

for(attr in objDataset)
{
   if(attr == "某條件")
   {
    arr[attr] = objDataset[attr];
   }
}

if(arr.length == 0)
{
  // do something
}

乍看之下,完全沒發現自己做了什麼蠢事,當debug的時候才發現,為什麼arr.length == 0永遠都成立??

一回頭檢查才發現,在我放值進去的時候,arr默默轉成object了????
所以直接就是undefined,永遠都進了do something那段=..=
紀念一下算是真正被JS無形別雷到的我

調整方法有以下幾個

  • 乾脆把值塞成一個物件,最後轉成Array,這樣就可以繼續用length看Array的長度了
let obj = {};

for(attr in objDataset)
{
   if(attr == "某條件")
   {
    obj[attr] = objDataset[attr];
   }
}
var arrKeylist = Object.entries(obj);
/**
[  
  ["name", "John"],
  ["age", 30],
  ["gender", "male"]
]
*/
// 長度 arrKeylist.length
  • 也可塞成一個Object裡面,用Object.keys把key值轉array,這樣也可以看長度
let obj = {};

for(attr in objDataset)
{
   if(attr == "某條件")
   {
    obj.attr = objDataset[attr];
   }
}
// { a: 1, b: 2, c: 3 }
// 長度  Object.keys(obj).length