第2章 数组

Array

var daysOfWeek = [];

var daysOfWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

var daysOfWeek = new Array(); //{1}

var daysOfWeek = new Array(7); //{2}

console.log(daysOfWeek.length);

var daysOfWeek = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); //{3}

for (var i=0; i<daysOfWeek.length; i++){
    console.log(daysOfWeek[i]);
}

//console.table(daysOfWeek);

//fibonacci numbers
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
var fibonacci = []; //{1}
fibonacci[1] = 1; //{2}
fibonacci[2] = 1; //{3}

for(var i = 3; i < 20; i++){
    fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]; ////{4}
}

for(var i = 1; i<fibonacci.length; i++){ //{5}
    console.log(fibonacci[i]);           //{6}
}

//instead of {5} and {6} we can simply use
console.log(fibonacci);

添加删除

function printArray(myArray) {
    for (var i=0; i<myArray.length; i++){
        console.log(myArray[i]);
    }
}

var numbers = [0,1,2,3,4,5,6,7,8,9];

//add a new element to the numbers array
numbers[numbers.length] = 10;

numbers.push(11);

numbers.push(12, 13);

//printArray(numbers);

//insert first position manually
for (var i=numbers.length; i>=0; i--){
    numbers[i] = numbers[i-1];
}

numbers[0] = -1;

//printArray(numbers);

//using method unshift
numbers.unshift(-2);

//printArray(numbers);

numbers.unshift(-4, -3);

//printArray(numbers);

//**** Removing elements

numbers.pop();

//remove first position manually
/*for (var i=0; i<numbers.length; i++){
    numbers[i] = numbers[i+1];
}*/

printArray(numbers);

console.log(numbers.length);

//using method shift
numbers.shift();

printArray(numbers);
console.log(numbers.length);

//**** Removing and Adding elements from the middle of the array or specific position
//splice method - parameter (index, howManyPositionsToBeRemoved, item1...itemX)
numbers.splice(5,3);

console.log('----');

printArray(numbers);

numbers.splice(5,0,2,3,4);

console.log('----');

printArray(numbers);

console.log('----');

numbers.splice(5,3,2,3,4);

printArray(numbers);

二维与多维数组

var averageTempDay1 = [72,75,79,79,81,81];
var averageTempDay2 = [81,79,75,75,73,72];

var averageTemp = [];

//same as
averageTemp[0] = [72,75,79,79,81,81];
averageTemp[1] = [81,79,75,75,73,72];

function printMatrix(myMatrix) {
    for (var i=0; i<myMatrix.length; i++){
        for (var j=0; j<myMatrix[i].length; j++){
            console.log(myMatrix[i][j]);
        }
    }
}

printMatrix(averageTemp);

//same as

//day 1
averageTemp[0] = [];
averageTemp[0][0] = 72;
averageTemp[0][1] = 75;
averageTemp[0][2] = 79;
averageTemp[0][3] = 79;
averageTemp[0][4] = 81;
averageTemp[0][5] = 81;
//day 2
averageTemp[1] = [];
averageTemp[1][0] = 81;
averageTemp[1][1] = 79;
averageTemp[1][2] = 75;
averageTemp[1][3] = 75;
averageTemp[1][4] = 73;
averageTemp[1][5] = 72;

printMatrix(averageTemp);

//** Multidimensional Matrix

//Matrix 3x3x3 - Cube

var matrix3x3x3 = [];
for (var i=0; i<3; i++){
    matrix3x3x3[i] = [];
    for (var j=0; j<3; j++){
        matrix3x3x3[i][j] = [];
        for (var z=0; z<3; z++){
            matrix3x3x3[i][j][z] = i+j+z;
        }
    }
}

for (var i=0; i<matrix3x3x3.length; i++){
    for (var j=0; j<matrix3x3x3[i].length; j++){
        for (var z=0; z<matrix3x3x3[i][j].length; z++){
            console.log(matrix3x3x3[i][j][z]);
        }
    }
}

js数组方法参考

js数组中的常用方法总结

栈方法(后进先出)

ArrayObj.push()方法

ArrayObj.pop()方法

ArrayObj.push():就是向数组末尾添加新的元素,返回的是数组新的长度。
ArrayObj.pop():就是向数组中删除数组最后一个元素并且返回该元素。如果数组为空就返回undefined。

队列方法(先进先出)

ArrayObj.shift()

ArrayObj.unshift()

ArrayObj.shift():方法用于把数组中的第一个元素删除,并返回第一个元素的值。
如果数组是空的,则shift() 方法不进行任何操作,返回undefined。请注意,该方法不创建新数组,而是直接修改原来的数组。该方法会改变数组的长度。

ArrayObj.unshift() :该方法可把它的参数顺序添加到数组的头部。它直接修改了数组,而不是创建一个新的数组。返回的是新数组的长度。 
unshift()在IE6,IE7下,数据有添加成功,但返回值却是undefined.

转换方法

join()方法

join() 方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。返回一个字符串。

重排序方法

reverse()方法

sort()方法

reverse()方法会对反转数组项的顺序。

var values = [1, 2, 3, 4, 5];
values.reverse();
alert(values);  //5,4,3,2,1
这里数组的初始值及顺序是1、2、3、4、5。而调用数组的reverse()方法后,其值的顺序变成了5、4、3、2、1。

sort()方法按升序排列数组——即最小的值位于最前面,最大的值排在最后面。为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到字符串,以确定如何排序。即使数组中的每一项都是数组,sort()方法比较的也是字符串,如下所示:

var values = [0, 1, 5, 10, 15];
values.sort();
alert(values);  //0,1,10,15,5
这种排序方式在很多情况下都不是最佳方案。因此sort()方法可以接受一个比较函数作为参数,以便我们指定那个值位于那个值的前面。

比较函数接受两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等,则返回0,如果第一个参数位于第二个之后则返回一个正数。以下就是一个简单的比较函数:


function compare(value1, value2) {
   if (value1 < value2) {
       return -1;
   } else if (value1 > value2) {
       return 1;
   } else {
       return 0;
   }
}



这个比较函数可以使用于大多数数据类型,只要将其作为参数传递给sort()方法即可,如下面这个例子所示:

var values = [0, 1, 2, 5, 10, 15];
values.sort(compare);
alert(values);  //0,1,5,10,15


在将比较函数传递到sort()方法之后,数值仍然保持了正确的升序。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可:


function compare(value1, value2) {
   if (value1 < value2) {
       return 1;
   } else if (value1 > value2) {
       return -1;
   } else {
       return 0;
   }
}
var values = [0, 1, 2, 5, 10, 15];
values.sort(compare);
alert(values);  //15,10,5,1,0

reverse()和sort()方法会返回值是经过排序之后的数组。

对于数值类型或者其valueOf方法会返回数值类型的对象类型,可以使用一个更简单的比较函数。这个函数只要用第二个值减第一个值即可:

function compare(value1, value2) {
   return value2 - value1;
}
由于比较函数通过返回一个小于零、等于零或大于零的值来影响排序结果,因此减法操作就可以适当处理所有情况。

操作方法

concat()方法

slice()方法

splice()方法

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。


<script type="text/javascript">

var a = [1,2,3];
document.write(a.concat(4,5));

</script>

输出的结果:1,2,3,4,5

slice(start,end)方法
start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。 
end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
返回值:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。

splice() 方法用于插入、删除或替换数组的元素
语法:arrayObject.splice(index,howmany,element1,.....,elementX)

index 必需。规定从何处添加/删除元素。
该参数是开始插入和(或)删除的数组元素的下标,必须是数字。

howmany 必需。规定应该删除多少元素。必须是数字,但可以是 "0"。
如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素。

element1 可选。规定要添加到数组的新元素。从 index 所指的下标处开始插入。 
elementX 可选。可向数组添加若干元素。

返回值:如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。
说明:splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

下面简要概括一下slice()与splice()方法

slice(start, end); slice()方法返回从参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起死和结束位置之间的项,但不包括结束位置的项。


var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);

console.log(colors2); // green, blue, yellow, purple
console.log(colors3); // green, blue, yellow

splice()有删除,插入,替换的功能

删除
需要两个参数,要删除的第一项的位置和要删除的项数。

var colors = ["red", "green", "blue"];
var removed = colors.splice(0,1);
console.log(colors); // greeen, blue
console.log(removed); // red
插入
需要三个参数:起始位置、0(要删除的项数)和要插入的项

var colors = ["red", "green", "blue"];
var removed = colors.splice(1,0,"yellow", "orange");
console.log(colors); // ["red", "yellow", "orange", "green", "blue"]
console.log(removed); // 返回空
替换
需要三个参数:起始位置、要删除的项数和要插入的任意数量的项。

var colors = ["red", "green", "blue"];
var removed = colors.splice(1,1,"yellow", "orange");
console.log(colors);  // ["red", "yellow", "orange", "blue"]
console.log(removed); // ["green"]

//*** contact
var zero = 0;
var positiveNumbers = [1,2,3];
var negativeNumbers = [-3,-2,-1];
var numbers = negativeNumbers.concat(zero, positiveNumbers);

console.log(numbers);

//console.log(numbers);

//*** every and some
var isEven = function (x) {
    // returns true if x is a multiple of 2.
    console.log(x);
    return (x % 2 == 0) ? true : false;
};
var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

numbers.every(isEven); //is going to execute the function only once

console.log('---');

numbers.some(isEven); //is going to execute the function twice

numbers.forEach(function(x){
    console.log((x % 2 == 0));
});

console.log(numbers.reverse());

//console.log('*** filter ***');

var evenNumbers = numbers.filter(isEven);

//console.log(evenNumbers);

console.log('*** map ***');

//console.log(numbers.map(isEven));

console.log(numbers.reduce(function(previous, current, index){
    return previous + current;
}));

console.log(numbers.sort());

console.log(numbers.sort(function(a,b){
    return a-b;
}));

function compare(a, b) {
    if (a < b) {
        return -1;
    }
    if (a > b) {
        return 1;
    }
    // a must be equal to b
    return 0;
}

console.log(numbers.sort(compare));

//Sorting objects

var friends = [
    {name: 'John', age: 30},
    {name: 'Ana', age: 20},
    {name: 'Chris', age: 25}
];

function comparePerson(a, b){
    if (a.age < b.age){
        return -1
    }
    if (a.age > b.age){
        return 1
    }
    return 0;
}

console.log(friends.sort(comparePerson));

var names =['Ana', 'ana', 'john', 'John'];
console.log(names.sort());

console.log(names.sort(function(a, b){
    if (a.toLowerCase() < b.toLowerCase()){
        return -1
    }
    if (a.toLowerCase() > b.toLowerCase()){
        return 1
    }
    return 0;
}));

var names2 = ['Maève', 'Maeve'];
console.log(names2.sort(function(a, b){
    return a.localeCompare(b);
}));

//*** toString
console.log(numbers.toString());

console.log(numbers.indexOf(10));
console.log(numbers.indexOf(100));

numbers.push(10);
console.log(numbers.lastIndexOf(10));
console.log(numbers.lastIndexOf(100));

var numbersString = numbers.join('-');
console.log(numbersString);

把数组内容发送到服务器,或进行编码解码,很有用

ES6

let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

//********** forEch using arrow functions
console.log('forEach using arrow functions');

numbers.forEach(x => {
    console.log((x % 2 == 0));
});

//********** using for..of loop
console.log('using for..of loop');

for (let n of numbers) {
    console.log((n % 2 == 0) ? 'even' : 'odd');
}

//********** Using the new ES6 iterator (@@iterator)
console.log('Using the new ES6 iterator (@@iterator)');

let iterator = numbers[Symbol.iterator]();
console.log(iterator.next().value); //1
console.log(iterator.next().value); //2
console.log(iterator.next().value); //3
console.log(iterator.next().value); //4
console.log(iterator.next().value); //5

//********** Array entries, keys and values
console.log('Array entries, keys and values');

console.log('Array.entries');
let aEntries = numbers.entries(); //retrieve iterator of key/value
console.log(aEntries.next().value); // [0, 1] - position 0, value 1
console.log(aEntries.next().value); // [1, 2] - position 1, value 2
console.log(aEntries.next().value); // [2, 3] - position 2, value 3

console.log('Array.keys');
let aKeys = numbers.keys(); //retrieve iterator of keys
console.log(aKeys.next()); // {value: 0, done: false } done false means iterator has more values
console.log(aKeys.next()); // {value: 1, done: false }
console.log(aKeys.next()); // {value: 2, done: false }

console.log('Array.values');
//let aValues = numbers.values();
console.log(aValues.next()); // {value: 1, done: false } done false means iterator has more values
console.log(aValues.next()); // {value: 2, done: false }
console.log(aValues.next()); // {value: 3, done: false }

//********** Using the from method
console.log('Using the from method');

let evens = Array.from(numbers, x => (x % 2 == 0));
console.log(evens);

let numbers2 = Array.from(numbers);
console.log(numbers2);

//********** Using Array.of
console.log('Using Array.of');

let numbers3 = Array.of(1);
let numbers4 = Array.of(1,2,3,4,5,6);
let numbersCopy = Array.of(...numbers4);
console.log(numbers3);
console.log(numbers4);
console.log(numbersCopy);

//********** Using the fill method
console.log('Using the fill method');

numbersCopy.fill(0);
console.log(numbersCopy);

numbersCopy.fill(2, 1);
console.log(numbersCopy);

numbersCopy.fill(1, 3, 5);
console.log(numbersCopy);

let ones = Array(6).fill(1);
console.log(ones);

//********** Using the copyWithin method
console.log('Using the copyWithin method');

let copyArray = [1, 2, 3, 4, 5, 6];
console.log(copyArray);

copyArray = copyArray.copyWithin(0, 3); //pos 3 value is copied to pos 0
console.log(copyArray);

copyArray = [1, 2, 3, 4, 5, 6];
copyArray = copyArray.copyWithin(1, 3, 5); //pos 3-4 values are copied to pos 1-2
console.log(copyArray);

//********** methods find and findIndex
console.log('methods find and findIndex');

function multipleOf13(element, index, array) {
    return (element % 13 == 0) ? true : false;
}

console.log(numbers.find(multipleOf13));
console.log(numbers.findIndex(multipleOf13));

//********** EcmaScript 7: using the method includes
console.log('EcmaScript 7: using the method includes');

console.log(numbers.includes(15));
console.log(numbers.includes(20));

let numbers5 = [7,6,5,4,3,2,1];
console.log(numbers5.includes(4,5));

TypedArrays

let length = 5;
let int16 = new Int16Array(length);

let array16 = [];
array16.length = length;

for (let i=0; i<length; i++){
    int16[i] = i+1;
}

console.log(int16);


//Int8Array();
//Uint8Array();
//Uint8ClampedArray();
//Int16Array();
//Uint16Array();
//Int32Array();
//Uint32Array();
//Float32Array();
//Float64Array();

http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/

http://www.i-programmer.info/programming/javascript/6135-javascript-data-structures-typed-arrays.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 注:该篇文章摘自于github.com/vhf/free-programming-books,英文版。访问该项目获...
    stuha阅读 3,912评论 0 13
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,262评论 7 249
  • 今天最开心,比我昨天生日都开心一百倍,因为我成功进入公司的VIP部门!!,这个喜悦无法言语,只因为这是我工作以来,...
    静候蜕变阅读 368评论 0 2
  • 标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 斜体+粗体 斜体粗体 链接 新浪微博 图片 表格...
    蒙奇奇呀阅读 3,791评论 0 0
  • 1、你,也能看见吗? 无名指又流血了,血珠子从指腹的“工”字细密的涌出,逐渐汇成巨大的一点,怎么擦都不干净。 ...
    十日后阅读 345评论 0 1