鸥睿客網(wǎng)上面有一個(gè)關(guān)于js的自測姜骡,然后我看了一下原作者的github,記錄一下解題過程吧屿良。
所以圈澈,對數(shù)組操作,不改變原來數(shù)組的方法管引,concat,slice,
改變原來數(shù)組的方法士败,splice,pop,shift,push,unshift
- 找出元素 item 在給定數(shù)組 arr 中的位置
我的答案
function indexOf(arr, item) {
for(var i=0;i<arr.length;i++){
if(arr[i]=== item){
return i;
}
}
return -1
}
原作者給出的答案。
indexOf: function(arr, item) {
/*
if (Array.prototype.indexOf) { return arr.indexOf(item); }
*/
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
return i;
}
}
return -1;
},
這里面有一行被注釋褥伴,如果這個(gè)方法存在的話谅将,那么直接返回這個(gè)方法,否則使用重新定義的方法重慢。還有一個(gè)是提前計(jì)算數(shù)組的長度饥臂,這樣可以提高效率。
- 數(shù)組求和
我的答案
function sum(arr) {
var sum = 0;
for(var i =0,len=arr.length;i<len;i++){
sum = sum + arr[i];
}
return sum;
}
原作者給出的答案
sum: function(arr) {
var sum = 0;
for (var i = 0, len = arr.length; i < len; i++) {
sum += arr[i];
}
return sum;
},
- 移除元素,返回新數(shù)組
我的答案
function remove(arr, item) {
var new_arr = [];
for(var i=0,len = arr.length;i<len;i++){
if(arr[i]!==item){
new_arr.push(arr[i]);
}
}
return new_arr;
}
原作者
remove: function(arr, item) {
var ret = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] !== item) {
ret.push(arr[i]);
}
}
return ret;
},
- 移除數(shù)組元素不要拷貝
移除數(shù)組 arr 中的所有值與 item 相等的元素似踱,直接在給定的 arr 數(shù)組上進(jìn)行操作隅熙,并將結(jié)果返回
我的解法
function removeWithoutCopy(arr, item) {
for(var i=arr.length-1;i>=0;i--){
if(arr[i]===item){
arr.splice(i,1);
}
}
return arr;
}
原作者
removeWithoutCopy: function(arr, item) {
var i;
var len;
for (i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
arr.splice(i, 1);
i--;
len--;
}
}
return arr;
},
好吧,我覺得我的方法更好核芽。
- 添加元素
在數(shù)組 arr 末尾添加元素 item囚戚。不要直接修改數(shù)組 arr,結(jié)果返回新的數(shù)組
function append(arr, item) {
var new_arr = [];
for(var i=0;i<arr.length;i++){
new_arr.push(arr[i]);
}
new_arr.push(item);
return new_arr;
}
看到有一些關(guān)于數(shù)組的操作轧简,其中concat是不改變原數(shù)組的
function append(arr, item) {
// return arr.push(item);
return arr.concat([item]);
}
另外或者利用slice來復(fù)制數(shù)組
function append(arr, item) {
var a = arr.slice(0);
a.push(item);
return a;
}
原作者給的答案东揣,應(yīng)該是歧義吧
append: function(arr, item) {
arr.push(item);
return arr;
}
- 刪除數(shù)組第一個(gè)元素
function curtail(arr) {
return [].concat(arr).slice(1);
}
當(dāng)時(shí)沒想到山卦,slice也是復(fù)制數(shù)組的豆励,所以應(yīng)該是
function curtail(arr) {
return arr.slice(1);
}
與上題一樣洼滚,作者給出來的是改變數(shù)組的
truncate: function(arr) {
arr.pop();
return arr;
},
- 數(shù)組合并
合并數(shù)組 arr1 和數(shù)組 arr2。不要直接修改數(shù)組 arr皮璧,結(jié)果返回新的數(shù)組
我的,我以為要自己原生態(tài)實(shí)現(xiàn)舟扎。
function concat(arr1, arr2) {
return arr1.concat(arr2);
}
作者的
concat: function(arr1, arr2) {
return arr1.concat(arr2);
}
- 添加元素
在數(shù)組 arr 的 index 處添加元素 item。不要直接修改數(shù)組 arr悴务,結(jié)果返回新的數(shù)組
先用slice拷貝數(shù)組睹限,再用splice來添加元素.
function insert(arr, item, index) {
var b = arr.slice(0);
b.splice(index,0,item);
return b;
}
原作者不拷貝
insert: function(arr, item, index) {
arr.splice(index, 0, item);
return arr;
}
- 計(jì)數(shù)
function count(arr, item) {
var cc = 0;
for(var i=0;i<arr.length;i++ ){
if(arr[i]===item){
cc+=1;
}
}
return cc;
}
作者
count: function(arr, item) {
var count = 0;
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
count++;
}
}
return count;
}
- 查找重復(fù)元素
找出數(shù)組 arr 中重復(fù)出現(xiàn)過的元素
function duplicates(arr) {
var cc={};
var new_arr = [];
for(var i=0;i<arr.length;i++){
arr[i] in cc?cc[arr[i]]=cc[arr[i]]+1:cc[arr[i]] = 1;
}
for(key in cc){
if(cc[key]>1){
new_arr.push(key);
}
}
return new_arr;
}
duplicates: function(arr) {
var seen = {};
var dupes = [];
for (var i = 0, len = arr.length; i < len; i++) {
seen[arr[i]] = seen[arr[i]] ? seen[arr[i]] + 1 : 1;
}
for (var item in seen) {
if (seen.hasOwnProperty(item) && seen[item] > 1) {
dupes.push(item);
}
}
return dupes;
},
作者直接用seen[arr[i]]來表示存在與否,好吧我表示 保留意見,在這題里面是沒有問題的邦泄。但是hasOwnProperty來判斷熟悉也是應(yīng)該的删窒。
- 求二次方
為數(shù)組 arr 中的每個(gè)元素求二次方。不要直接修改數(shù)組 arr顺囊,結(jié)果返回新的數(shù)組
function square(arr) {
return arr.map(function(item){
return item*item;
})
}
square: function(arr) {
var ret = [];
for (var i = 0, len = arr.length; i < len; i++) {
ret.push(arr[i] * arr[i]);
}
return ret;
},
- 查找元素位置
function findAllOccurrences(arr, target) {
var res=[];
for(var i=0,len = arr.length;i<len;i++){
if(arr[i]===target){
res.push(i);
}
}
return res;
}
findAllOccurrences: function(arr, target) {
var ret = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === target) {
ret.push(i);
}
}
return ret;
}