資料型態簡單釋義
物件 (Object)
可以存放屬性和函式的容器。陣列 (Array)
可以存放多個不一定要相同資料型態變數的容器。當兩種型態皆可使用時,如何選擇?
以學生 (Student) 舉例,學生的屬性有姓名 (Name)、性別 (Gender)、座位 (Seat Number)。現在有三位學生,Mary、Tom、Mark。
陣列搭配物件 (Objects in Array) 寫法
var studentArray = [{
name: "Mary",
gender: "Female",
seatNumber: 1
}, {
name: "Tom",
gender: "Male",
seatNumber: 2
}, {
name: "Mark",
gender: "Male",
seatNumber: 3
}];
純物件 (Objects in Object) 寫法
var studentsObjectA = {
Mary: {
gender: "Female",
seatNumber: 1
},
Tom: {
gender: "Male",
seatNumber: 2
},
Mark: {
gender: "Male",
seatNumber: 3
}
}
或者var studentsObjectB = {
1: {
name: "Mary",
gender: "Female"
},
2: {
name: "Tom",
gender: "Male"
},
3: {
name: "Mark",
gender: "Male"
}
}
情況一
若只有要取某一個物件,或者做搜尋,像是取其中某一個名字的學生、某一個座位的學生資料、
確認某個座位有沒有人、某一個名字有沒有人用、
增刪學生、增刪學生資料,
使用純物件 (Objects in Object) 會比陣列搭配物件 (Objects in Array) 方便。
陣列搭配物件 (Objects in Array) 寫法
var EMPTY = null;
var FAIL = false;
var SUCCESS = true;
function getStudentByName(name) {
for(student in studentArray) {
if(student.name == name) {
return student;
}
}
return EMPTY;
}
function addStudent(name, gender, seatNo) {
studentArray.push({
name: name,
gender: gender,
seatNumber: seatNo
});
return studentArray;
}
function removeStudentByName(name) {
var i;
for(i = 0; i < studentArray.length; i++) {
if(student.name == name) {
break;
}
}
if(i == studentArray.length) {
return SUCCESS;
}
studentArray.splice(i, 1);
return SUCCESS;
}
純物件 (Objects in Object) 寫法
var EMPTY = null;
var FAIL = false;
var SUCCESS = true;
function getStudentByName(name) {
if(studentsObjectA[name] != undefined) {
studentsObjectA[name].name = name;
return studentsObjectA[name];
}
return EMPTY;
}
function getStudentBySeatNumber(number) {
if(studentsObjectB[number] != undefined) {
studentsObjectB[number].seatNumber = number;
return studentsObjectB[number];
}
return EMPTY;
}
function addStudent(name, gender, seatNo) {
studentsObjectA[name] = {
gender: gender,
seatNumber: seatNo
};
return studentsObjectA;
// studentsObjectB["" + seatNo] = {
// name: name,
// gender: gender
// };
// return studentsObjectB;
}
function removeStudentByName(name) {
delete studentsObjectA[name]
return SUCCESS;
}
其實就是變相加索引值 (indexing),或者說,把索引值的可使用性提升,
從純粹順序 index,到有意義的 index。
在這種情況下,純物件 (Objects in Object) 用起來方便多了,時間複雜度也較小,
缺點是如果拿去當屬性名稱/索引值的屬性是重要的、要一起取的,
要再加回去,或者一開始就多加一次。
情況二
若有需要每一個物件都要處理某件事情,像是所有學生換座位,無論使用哪一種,使用方式和時間複雜度都差不多。
陣列搭配物件 (Objects in Array) 寫法
var SUCCESS = true;
function changeSeat() {
for(student in studentArray) {
student.seatNum++;
if(student.seatNum == 4) {
student.seatNum = 1;
}
}
return SUCCESS;
}
純物件 (Objects in Object) 寫法
var SUCCESS = true;
function changeSeat() {
for(var name in studentsObjectA) {
var student = studentsObjectA[name];
student.seatNum++;
if(student.seatNum == 4) {
student.seatNum = 1;
}
}
return SUCCESS;
}
結論
純物件 (Objects in Object) 的用法顯然比陣列搭配物件 (Objects in Array) 的用法方便也快多了,就易用性來說,純物件 (Objects in Object) 勝!但,宣告為陣列讓人一看就知道是很多個同樣物件,而宣告為物件則還要看做些什麼事情才能知道內容物的長相,所以就易讀性上來說,陣列搭配物件 (Objects in Array) 勝!實際使用,還是依據大家的需要和架構設計來決定囉!
沒有留言:
張貼留言