一、Validate US Telephone Numbers 美国电话号码正则匹配
代码如下:
function telephoneCheck(str) {
// Good luck!
var arr = str.match(/1?\s?\d{3}[\s-]?\d{3}[\s-]?\d{4}|1?\s?\(\d{3}\)[\s-]?\d{3}[\s-]?\d{4}/);
return arr!==null && arr[0].length === str.length;
}
telephoneCheck("555-555-5555");
二、Record Collection 更新对象记录集
代码如下:
// Setup
var collection = {
"2548": {
"album": "Slippery When Wet",
"artist": "Bon Jovi",
"tracks": [
"Let It Rock",
"You Give Love a Bad Name"
]
},
"2468": {
"album": "1999",
"artist": "Prince",
"tracks": [
"1999",
"Little Red Corvette"
]
},
"1245": {
"artist": "Robert Palmer",
"tracks": [ ]
},
"5439": {
"album": "ABBA Gold"
}
};
// Keep a copy of the collection for tests
var collectionCopy = JSON.parse(JSON.stringify(collection));
// Only change code below this line
function updateRecords(id, prop, value) {
if(value===''){
delete collection[id][prop];
}else{
if(prop === 'tracks'){
if(collection[id].hasOwnProperty('tracks')){
collection[id][prop].push(value);
}else{
collection[id].tracks = [];
collection[id][prop].push(value);
}
}else{
collection[id][prop] = value;
}
}
return collection;
}
// Alter values below to test your code
updateRecords(5439, "artist", "ABBA");
三、Symmetric Difference 求多数组的对称差元素集
代码如下:
function sym() {
var arr = [],
rArr = [];
for (var i = 0; i < arguments.length; i++) {
arr.push(arguments[i]);
}
arr = arr.reduce(function (acc, val) {
var tArr = [];
for (var i = 0; i < acc.length; i++) {
if (val.indexOf(acc[i]) < 0) {
tArr.push(acc[i]);
}
}
for (var j = 0; j < val.length; j++) {
if (acc.indexOf(val[j]) < 0) {
tArr.push(val[j]);
}
}
return tArr;
}, []);
arr.forEach(function(val){
if(rArr.indexOf(val)<0){
rArr.push(val);
}
});
return rArr;
}
sym([1, 2, 3], [5, 2, 1, 4]);
四、Exact Change 找零计算
代码如下:
function checkCashRegister(price, cash, cid) {
var change = cash - price,
totalCash = 0,
rArr = [],
isDone = false;
// Here is your change, ma'am.
cid.forEach(function (arr) {
totalCash += arr[1];
});
if (change > totalCash) {
return 'Insufficient Funds';
} else if (change == totalCash) {
return 'Closed';
} else {
for (var i = cid.length - 1; i >= 0; i--) {
if (cid[i][1] < change) {
if (cid[i][1] !== 0) {
rArr.push(cid[i]);
change -= cid[i][1];
}
if (cid[i][0] === 'PENNY') {
return 'Insufficient Funds';
}
} else {
var t = 0;
switch (cid[i][0]) {
case 'PENNY':
t = Math.round(change * 100) * 0.01;
rArr.push(['PENNY', t]);
change -= t;
if (change >= 0.01) {
return 'Insufficient Funds';
}
break;
case 'NICKEL':
t = parseInt(change / 0.05) * 0.05;
if (t > 0) {
rArr.push(['NICKEL', t]);
change -= t;
}
break;
case 'DIME':
t = parseInt(change / 0.1) * 0.1;
if (t > 0) {
rArr.push(['DIME', t]);
change -= t;
}
break;
case 'QUARTER':
t = parseInt(change / 0.25) * 0.25;
if (t > 0) {
rArr.push(['QUARTER', t]);
change -= t;
}
break;
case 'ONE':
t = parseInt(change / 1) * 1;
if (t > 0) {
rArr.push(['ONE', t]);
change -= t;
}
break;
case 'FIVE':
t = parseInt(change / 5) * 5;
if (t > 0) {
rArr.push(['FIVE', t]);
change -= t;
}
break;
case 'TEN':
t = parseInt(change / 10) * 10;
if (t > 0) {
rArr.push(['TEN', t]);
change -= t;
}
break;
case 'TWENTY':
t = parseInt(change / 20) * 20;
if (t > 0) {
rArr.push(['TWENTY', t]);
change -= t;
}
break;
case 'ONE HUNDRED':
t = parseInt(change / 100) * 100;
if (t > 0) {
rArr.push(['ONE HUNDRED', t]);
change -= t;
}
break;
}
if (change === 0) {
break;
}
}
}
return rArr;
}
}
// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]
checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);
五、Inventory Update 更新存储池
代码如下:
function updateInventory(arr1, arr2) {
// All inventory must be accounted for or you're fired!
var len = arr1.length;
arr2.forEach(function (val) {
var isInArr1 = false;
for (var i = 0; i < len; i++) {
if (arr1[i][1] === val[1]) {
arr1[i][0] += val[0];
isInArr1 = true;
}
}
if (!isInArr1) {
arr1.push(val);
}
});
return arr1.sort(function (a, b) {
return a[1] > b[1];
});
}
// Example inventory lists
var curInv = [
[21, "Bowling Ball"],
[2, "Dirty Sock"],
[1, "Hair Pin"],
[5, "Microphone"]
];
var newInv = [
[2, "Hair Pin"],
[3, "Half-Eaten Apple"],
[67, "Bowling Ball"],
[7, "Toothpaste"]
];
updateInventory(curInv, newInv);
六、No repeats please 求全排列中不带重复元素的数列的个数
代码如下:
function permAlone(str) {
var arr = str.split(''),
rArr = [],
count = 0;
var swap = function (arr, i, j) {
if (i != j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
};
(function fn(n) { //为第n个位置选择元素
for (var i = n; i < arr.length; i++) {
swap(arr, i, n);//换
if (n + 1 < arr.length - 1) //判断数组中剩余的待全排列的元素是否大于1个
{
fn(n + 1);//从第n+1个下标进行全排列
} else {
rArr.push(arr.join(''));
}
swap(arr, i, n);//复原
}
})(0);
count = rArr.length;
rArr.forEach(function (val) {
if (val.match(/([a-z]{1})\1/)) {
count--;
}
});
return count;
}
permAlone('aab');
七、Friendly Date Ranges 日期段的友好显示
代码如下:
function makeFriendlyDates(arr) {
var fArr = arr[0].split('-'),
tArr = arr[1].split('-'),
fY = fArr[0],
fM = fArr[1],
fD = fArr[2],
tY = tArr[0],
tM = tArr[1],
tD = tArr[2],
mArr = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
dArr = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th', '21st', '22nd', '23rd', '24th', '25th', '26th', '27th', '28th', '29th', '30th', '31st'],
today = new Date(),
rArr = [];
if (arr[0] === arr[1]) {
rArr[0] = mArr[parseInt(fM) - 1] + ' ' + dArr[parseInt(fD) - 1] + ', ' + fY;
return rArr;
}
if ((new Date(parseInt(tY), parseInt(tM) - 1, parseInt(tD))).getTime() - (new Date(parseInt(fY), parseInt(fM) - 1, parseInt(fD))).getTime() < 3600000 * 24 * 365)
{
if (parseInt(fY) === 2016) {
rArr[0] = mArr[parseInt(fM) - 1] + ' ' + dArr[parseInt(fD) - 1];
} else {
rArr[0] = mArr[parseInt(fM) - 1] + ' ' + dArr[parseInt(fD) - 1] + ', ' + fY;
}
if (tM === fM && tY===fY) {
rArr[1] = dArr[parseInt(tD) - 1];
} else {
rArr[1] = mArr[parseInt(tM) - 1] + ' ' + dArr[parseInt(tD) - 1];
}
} else {
rArr[0] = mArr[parseInt(fM) - 1] + ' ' + dArr[parseInt(fD) - 1] + ', ' + fY;
rArr[1] = mArr[parseInt(tM) - 1] + ' ' + dArr[parseInt(tD) - 1] + ', ' + tY;
}
return rArr;
}
八、Make a Person 面向对象练习
代码如下:
var Person = function(firstAndLast) {
var arr = firstAndLast.split(' '),
first = arr[0],
last = arr[1],
fullName = firstAndLast;
this.getFirstName = function(){
return first;
};
this.getLastName = function(){
return last;
};
this.getFullName = function(){
return fullName;
};
this.setFirstName = function(f){
first = f;
fullName = first + ' ' + last;
};
this.setLastName = function(l){
last = l;
fullName = first + ' ' + last;
};
this.setFullName = function(fn){
arr = fn.split(' ');
fullName = fn;
first = arr[0];
last = arr[1];
};
};
var bob = new Person('Bob Ross');
bob.getFullName();
九、Map the Debris 根据海拔高度求轨道周期
代码如下:
function orbitalPeriod(arr) {
var GM = 398600.4418;
var earthRadius = 6367.4447;
var rArr = [];
arr.forEach(function (obj) {
var newObj = {};
newObj.name = obj.name;
newObj.orbitalPeriod = Math.round(2 * 3.14159265 * Math.pow(Math.pow(earthRadius + obj.avgAlt, 3) / GM, 0.5));
rArr.push(newObj);
});
return rArr;
}
orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);
十、Pairwise 求数组两元素之和为第二个参数的组合的下标之和
代码如下:
function pairwise(arr, arg) {
var len = arr.length,
r = 0,
cArr = [];
for (var i = 0; i < len; i++) {
for (var j = i + 1; j < len; j++) {
if (arr[i] + arr[j] === arg && i !== j && !(cArr.indexOf(i) > 0 || cArr.indexOf(j) > 0)) {
r = r + i + j;
cArr.push(i);
cArr.push(j);
break;
}
}
}
return r;
}
pairwise([1,4,2,3,0,5], 7);