開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- JavaScript (プログラミング言語)
- jQuery (Library)
- Safari(Web browser)
Eloquent JavaScript(Marijn Haverbeke 著、No Starch Press)のPart 1(Language)、Chapter 4(DataStructures: Objects and Arrays)、Exercises(The Sum of Range, Reversing an Array, A List, Deep Comparison)を取り組んでみる。
Exercises
コード(Emacs)
(function () {
'use strict';
var ary,
list,
list1,
sum,
range,
reverseArray,
reverseArrayInPlace,
arrayToList,
listToArray,
prepend,
nth,
deepEqual;
sum = function (numbers) {
var result = 0;
numbers.forEach(function (num) {
result += num;
});
return result;
};
range = function (start, end, step) {
var i,
nums = [];
if (step === undefined) {
step = 1;
}
if (step >= 0) {
for (i = start; i <= end; i += step) {
nums.push(i);
}
} else {
for (i = start; i >= end; i += step) {
nums.push(i);
}
}
return nums;
};
console.log(sum(range(1, 10)));
console.log(range(1, 10, 2));
console.log(range(5, 2, -1));
ary = ['a', 'b', 'c', 'd', 'e'];
reverseArray = function (ary) {
var len = ary.length,
a = [],
i;
for (i = 0; i < len; i += 1) {
a[i] = ary[len - 1 - i];
}
return a;
};
reverseArrayInPlace = function (ary) {
var i,
j,
t;
for (i = 0, j = ary.length - 1; i < j; i += 1, j -= 1) {
t = ary[i];
ary[i] = ary[j];
ary[j] = t;
}
};
console.log(ary);
console.log(reverseArray(ary));
console.log(ary);
reverseArrayInPlace(ary);
console.log(ary);
arrayToList = function (ary) {
var obj = null,
i,
len = ary.length;
for (i = len - 1; i >= 0; i -= 1) {
if (obj === null) {
obj = {value: ary[i], rest: null};
} else {
obj = {value: ary[i], rest: obj};
}
}
return obj;
};
ary = [1,2,3];
list = arrayToList([1,2,3]);
console.log(ary);
console.log(list);
listToArray = function (list) {
var ary = [],
obj = list;
if (obj === null) {
return ary;
}
for (;obj.rest !== null; obj = obj.rest) {
ary.push(obj.value);
}
if (obj !== null) {
ary.push(obj.value);
}
return ary;
};
ary = listToArray(list);
console.log(ary);
console.log(list);
prepend = function (elem, list) {
var list0 = {value: elem, rest: list};
return list0;
};
nth = function (list, num) {
if (list === null) {
return undefined;
}
if (num === 0) {
return list.value;
}
return nth(list.rest, num - 1);
};
list1 = prepend(10, list);
console.log(list)
console.log(list1)
console.log(nth(list, 0));
console.log(nth(list, 1));
console.log(nth(list, 2));
console.log(nth(list1, 10));
deepEqual = function (x, y) {
var props,
prop,
i,
max;
if (x === null && y === null) {
return true;
}
if (typeof x === 'object' && typeof y === 'object') {
props = Object.getOwnPropertyNames(x);
for (i = 0, max = props.length; i < max; i += 1) {
prop = props[i];
if (x[prop] !== y[prop]) {
return false;
}
}
return true;
}
return x === y;
};
ary = [1, 2, 'a', 'b', [1,2], list1, deepEqual];
console.log('deepEqual--------------------------------------------------')
ary.forEach(function (x) {
ary.forEach(function (y) {
console.log(x);
console.log(y);
console.log(deepEqual(x, y));
});
});
}());
入出力結果(Terminal, Node.js)
$ node sample.js
55
[ 1, 3, 5, 7, 9 ]
[ 5, 4, 3, 2 ]
[ 'a', 'b', 'c', 'd', 'e' ]
[ 'e', 'd', 'c', 'b', 'a' ]
[ 'a', 'b', 'c', 'd', 'e' ]
[ 'e', 'd', 'c', 'b', 'a' ]
[ 1, 2, 3 ]
{ value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }
[ 1, 2, 3 ]
{ value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }
{ value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
1
2
3
undefined
deepEqual--------------------------------------------------
1
1
true
1
2
false
1
a
false
1
b
false
1
[ 1, 2 ]
false
1
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
false
1
[Function]
false
2
1
false
2
2
true
2
a
false
2
b
false
2
[ 1, 2 ]
false
2
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
false
2
[Function]
false
a
1
false
a
2
false
a
a
true
a
b
false
a
[ 1, 2 ]
false
a
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
false
a
[Function]
false
b
1
false
b
2
false
b
a
false
b
b
true
b
[ 1, 2 ]
false
b
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
false
b
[Function]
false
[ 1, 2 ]
1
false
[ 1, 2 ]
2
false
[ 1, 2 ]
a
false
[ 1, 2 ]
b
false
[ 1, 2 ]
[ 1, 2 ]
true
[ 1, 2 ]
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
false
[ 1, 2 ]
[Function]
false
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
1
false
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
2
false
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
a
false
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
b
false
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
[ 1, 2 ]
false
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
true
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
[Function]
false
[Function]
1
false
[Function]
2
false
[Function]
a
false
[Function]
b
false
[Function]
[ 1, 2 ]
false
[Function]
{ value: 10,
rest: { value: 1, rest: { value: 2, rest: [Object] } } }
false
[Function]
[Function]
true
$
0 コメント:
コメントを投稿