1. 程式人生 > >js物件、Array物件及angularjs的遍歷

js物件、Array物件及angularjs的遍歷

一、JavaScript 物件

JavaScript 中的所有事物都是物件:字串、數值、陣列、函式…
此外,JavaScript 允許自定義物件。

所有事物都是物件。
JavaScript 提供多個內建物件,比如 String、Date、Array 等等。 物件只是帶有屬性和方法的特殊資料型別。
● 布林型可以是一個物件。
● 數字型可以是一個物件。
● 字串也可以是一個物件
● 日期是一個物件
● 數學和正則表示式也是物件
● 陣列是一個物件
● 甚至函式也可以是物件


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"
> <title>菜鳥教程(runoob.com)</title> </head> <body> <script> //物件只是一種特殊的資料。物件擁有屬性和方法。 person={firstname:"John",lastname:"Doe",age:50,eyecolor:"blue"} //物件(有鍵值) document.write(person.firstname + " is " + person.age + " years old."); document.write("<br>"); //JavaScript for...in 語句迴圈遍歷物件的屬性。
for(a in person){//a為物件的鍵值,person為物件 document.write(a+"=="+person[a]+" ");//person[a]為物件的屬性 } document.write("<br>"); ////////////////////////// var message="Hello World!"; var x=message.length; document.write(x);//訪問物件屬性 document.write("<br>"); ////////////////////////// var message="Hello world!"; var y=message.toUpperCase(); document.write(y);//訪問物件方法
document.write("<br>"); ///////////////////////// var myCars=["Saab","Volvo","BMW"]; //陣列(有下標) for(b in myCars){//b為陣列下標 document.write(b+"=="+myCars[b]+" ");//myCars[b]:陣列元素 } </script> </body> </html>

結果:

結果:
John is 50 years old.
firstname==John lastname==Doe age==50 eyecolor==blue 
12
HELLO WORLD!
0==Saab 1==Volvo 2==BMW

二、angularjs的遍歷:

angular有自己的生命週期。迴圈給一個 angular監聽的變數復值時。最好還是用angular自帶的迴圈方法:“angular.foreach”

1.針對物件迴圈(key,value)

var values = {name: 'misko', gender: 'male'};
var log = [];
angular.forEach(values, function(value, key) {
  this.push(key + ': ' + value);
}, log);
expect(log).toEqual(['name: misko', 'gender: male']);

2.針對物件陣列:指定開始遍歷

var objs =[{a:1},{a:2}];
angular.forEach(objs,function(data,index,array){
//data等價於array[index]
console.log(data.a+'='+array[index].a);
});

引數如下:
objs:需要遍歷的集合
data:遍歷時當前的資料
index:遍歷時當前開始索引
array:需要遍歷的集合,每次遍歷時都會把objs原樣的傳一次。

3.針對物件陣列:遍歷全部

var objs =[{a:1},{a:2}];
angular.forEach(objs, function(data){
//data等價於array[index]
console.log(data.a);
});

4.針對物件陣列:遍歷

 var list = [
                {id: 1, title: "部落格園", url: "http://www.cnblogs.com"},
                {id: 2, title: "知乎", url: "http://www.zhihu.com"},
                {id: 3, title: "codeproject", url: "http://www.codeproject.com/"},
                {id: 4, title: "stackoverflow", url: "http://www.stackoverflow.com/"}
            ];

                var t = 0;
                //匹配返回的專案
                angular.forEach(list, function (v, i) {
                    if (v.id == id) t = i;
                    //i:陣列item的下標,
                    //v: item,一個物件
                });

               console.log(list[t]);

三、區別物件與陣列的使用:

例子一:

<!doctype html>
<html ng-app="a6_3">
<head>
    <title>使用factory方法自定義服務</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
    <style type="text/css">
        body {
            font-size: 12px;
        }

        .show {
            background-color: #ccc;
            padding: 8px;
            width: 260px;
            margin: 10px 0px;
        }
    </style>
</head>
<body>
    <div ng-controller="c6_3">
        <div class="show">{{str('我是服務返回的內容')}}</div>
        <div class="show">{{name(1)}}</div>
    </div>
    <script type="text/javascript">
        angular.module('a6_3', [])
            .factory('$outfun', function () {
                return {
                    str: function (s) {
                        return s;
                    }
                };
            })
            .factory('$outarr', function () {
                return ['張三', '李四', '王二']
            })
            .controller('c6_3', function ($scope, $outfun, $outarr) {
                $scope.str = function (n) {
                    return $outfun.str(n);
//$outfun為物件,$outfun.str為根據鍵獲取物件的值,n為方法引數
                }

                $scope.name = function (n) {
        //$outarr為陣列,n為下標
                }
            });
    </script>
</body>
</html>

例子二:

<!doctype html>
<html ng-app="a6_2">
<head>
    <title>使用$provide自定義服務</title>
    <script src="../Script/angular.min.js"
            type="text/javascript"></script>
    <style type="text/css">
        body {
            font-size: 12px;
        }

        .show {
            background-color: #ccc;
            padding: 8px;
            width: 260px;
            margin: 10px 0px;
        }
    </style>
</head>
<body>
<div ng-controller="c6_2">
    <div class="show">
        服務返回的值:
        <span>{{info('name')}}</span>
        <span>{{info('sex')}}</span>
        <span>{{info('score')}}</span>
    </div>
</div>

<script type="text/javascript">
    angular.module('a6_2', [], function ($provide) {/*內建服務$provide*/
        $provide.factory('$output', function () {
            var stu = {
                name: '張三',
                sex: '男',
                score: '60'
            };
            return stu;
        })
    })
        .controller('c6_2', function ($scope, $output) {
            $scope.info = function (n) {
                for (_n in $output) {
         /*JavaScript for...in 語句迴圈遍歷物件的屬性。*/
                    if (_n == n) {/*物件的鍵*/
                        return ($output[_n]);
                        /*通過物件的鍵獲取物件的值*/
                    }
                }
            }
        });
</script>
</body>
</html>

四、JavaScript Array 物件

Array 物件
Array 物件用於在單個的變數中儲存多個值。

建立 Array 物件的語法:
new Array();
new Array(size);
new Array(element0, element1, ..., elementn);

Array 物件屬性
屬性          描述
constructor 返回對建立此物件的陣列函式的引用。
length      設定或返回陣列中元素的數目。
prototype   使您有能力向物件新增屬性和方法。
        語法:
        object.prototype.name=value

Array 物件方法
方法          描述
concat()    連線兩個或更多的陣列,並返回結果。
join()  把陣列的所有元素放入一個字串。元素通過指定的分隔符進行分隔。
pop()   刪除並返回陣列的最後一個元素
push()  向陣列的末尾新增一個或更多元素,並【返回新的長度】。
reverse()   顛倒陣列中元素的順序。
shift() 刪除並返回陣列的第一個元素
slice() 從某個已有的陣列【返回選定的元素】
sort()  對陣列的元素進行排序

splice()    刪除元素,並向陣列新增新元素。
    arrayObject.splice(index,deleteCount,item1,.....,itemX)
    引數  描述
    index   必需。整數,規定新增/刪除專案的位置,使用負數可從陣列結尾處規定位置。
    deleteCount必需。要刪除的專案數量。如果設定為 0,則不會刪除專案。
    item1, ..., itemX   可選。向陣列刪除的位置 新增的新專案。

toSource()  返回該物件的原始碼。
toString()  把陣列轉換為字串,並返回結果。
toLocaleString()    把陣列轉換為本地陣列,並返回結果。
unshift()   向陣列的開頭新增一個或更多元素,並返回新的長度。
valueOf()   返回陣列物件的原始值

JavaScript中陣列slice和splice的對比:

1、slice
slice是指定在一個數組中的元素建立一個新的陣列,即原陣列不會變。
定義和用法
slice() 方法可提取字串的某個部分,並以新的字串返回被提取的部分。
語法

stringObject.slice(start,end);
//提取包括start不包括end的新的資料,
//不改變原有
//返回提取的資料

引數 描述
start 要抽取的片斷的起始下標。如果是負數,則該引數規定的是從字串的尾部開始算起的位置。也就是說,-1 指字串的最後一個字元,-2 指倒數第二個字元,以此類推。
end 緊接著要抽取的片段的結尾的下標。若未指定此引數,則要提取的子串包括 start 到原字串結尾的字串。如果該引數是負數,那麼它規定的是從字串的尾部開始算起的位置。

返回值
一個新的字串。包括字串 stringObject 從 start 開始(包括 start)到 end 結束(不包括 end)為止的所有字元。

說明
String 物件的方法 slice()、substring() 和 substr() (不建議使用)都可返回字串的指定部分。slice() 比 substring() 要靈活一些,因為它允許使用負數作為引數。slice() 與 substr() 有所不同,因為它用兩個字元的位置來指定子串,而 substr() 則用字元位置和長度來指定子串。
還要注意的是,String.slice() 與 Array.slice() 相似。

陣列的 slice (ECMAScript 5.1 標準 15.4.4.10 節)非常類似於字串的 slice。根據規範,slice 需要兩個引數,起點和終點。它會返回一個包含了從起點開始,到終點之前之間所有元素的新陣列。(包含起點,不包含終點)

'abc'.slice(1,2)   // "b"   //擷取
[14, 3, 77].slice(1, 2) // [3]

var x = [14, 3, 77];
var y = x.slice(1, 2);
console.log(x);   // [14, 3, 77]    //不改變原有
console.log(y);   // [3]    //返回擷取的資料

//如果不傳入引數二end,那麼將從引數一的索引位置開始擷取,
//一直到陣列尾
var a=[1,2,3,4,5,6];
var b=a.slice(0,3);  //[1,2,3]
var c=a.slice(3);    //[4,5,6]

//如果兩個引數中的任何一個是負數,array.length會和它們相加,
//試圖讓它們成為非負數,舉例說明:
//當只傳入一個引數,且是負數時,length會與引數相加,然後再擷取
var a=[1,2,3,4,5,6];
var b=a.slice(-1);  //[6]

//當只傳入一個引數,是負數時,並且引數的絕對值大於等於陣列length時,會擷取整個陣列
var a=[1,2,3,4,5,6];
var b=a.slice(-6);  //[1,2,3,4,5,6]
var c=a.slice(-8);  //[1,2,3,4,5,6]

//當傳入兩個引數一正一負時,length也會先於負數相加後,再擷取
var a=[1,2,3,4,5,6];
var b=a.slice(2,-3);  //[3]

//當傳入一個引數,大於等於length時,將返回一個空陣列
var a=[1,2,3,4,5,6];
var b=a.slice(6);  //[]

var a="i am a boy";
var b=a.slice(0,6);  //"i am a"

2、splice
定義和用法
splice() 方法用於插入、刪除或替換陣列的元素。
語法

arrayObject.splice(index,howmany,element1,.....,elementX)
//從index開始,刪除howmany個元素,插入element1...等元素。
//改變原有資料。
//返回刪除的資料。

引數 描述
index
必需。規定從何處新增/刪除元素。
該引數是開始插入和(或)刪除的陣列元素的下標,必須是數字。
howmany
必需。規定應該刪除多少元素。必須是數字,但可以是 “0”。
如果未規定此引數,則刪除從 index 開始到原陣列結尾的所有元素。
element1 可選。規定要新增到陣列的新元素。從 index 所指的下標處開始插入。
elementX 可選。可向陣列新增若干元素。
返回值
如果從 arrayObject 中刪除了元素,則返回的是含有被刪除的元素的陣列。

說明
splice() 方法可刪除從 index 處開始的零個或多個元素,並且用引數列表中宣告的一個或多個值來替換那些被刪除的元素。

提示和註釋
註釋:請注意,splice() 方法與 slice() 方法的作用是不同的,splice() 方法會直接對陣列進行修改。

splice是JS中陣列功能最強大的方法,它能夠實現對陣列元素的刪除、插入、替換操作,返回值為被操作的值。
splice刪除:color.splice(1,2) (刪除color中的1、2兩項);
splice插入:color.splice(1,0,’brown’,’pink’) (在color鍵值為1的元素前插入兩個值);
splice替換:color.splice(1,2,’brown’,’pink’) (在color中替換1、2元素);
雖然 splice(15.4.4.12 節)也需要(至少)兩個引數,但它的意義則完全不同。splice 還會改變原陣列。

[14, 3, 77].slice(1, 2)  
//提取:從index1開始擷取到index2結束,返回擷取的資料: [3]
[14, 3, 77].splice(1, 2) 
//替換:從index1開始,刪除2個元素、未新增元素,結果返回新資料: [3, 77]

var x = [14, 3, 77]
var y = x.splice(1, 2)
console.log(x)   // [14]//改變原有
console.log(y)   // [3, 77]//返回被刪除

var a=['a','b','c'];
var b=a.splice(1,1,'e','f');  
//a=['a','e','f','c'],//改變原有資料
//b=['b']//返回被刪除的資料