資料型態簡單釋義
物件 (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) 勝!實際使用,還是依據大家的需要和架構設計來決定囉!
沒有留言:
張貼留言