牛客网上面有一个关于js的自测,然后我看了一下原作者的github,记录一下解题过程吧。
所以,对数组操作,不改变原来数组的方法,concat,slice,
改变原来数组的方法,splice,pop,shift,push,unshift
- 找出元素 item 在给定数组 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;
},
这里面有一行被注释,如果这个方法存在的话,那么直接返回这个方法,否则使用重新定义的方法。还有一个是提前计算数组的长度,这样可以提高效率。
- 数组求和
我的答案
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;
},
- 移除元素,返回新数组
我的答案
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;
},
- 移除数组元素不要拷贝
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
我的解法
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;
},
好吧,我觉得我的方法更好。
- 添加元素
在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
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;
}
看到有一些关于数组的操作,其中concat是不改变原数组的
function append(arr, item) {
// return arr.push(item);
return arr.concat([item]);
}
另外或者利用slice来复制数组
function append(arr, item) {
var a = arr.slice(0);
a.push(item);
return a;
}
原作者给的答案,应该是歧义吧
append: function(arr, item) {
arr.push(item);
return arr;
}
- 删除数组第一个元素
function curtail(arr) {
return [].concat(arr).slice(1);
}
当时没想到,slice也是复制数组的,所以应该是
function curtail(arr) {
return arr.slice(1);
}
与上题一样,作者给出来的是改变数组的
truncate: function(arr) {
arr.pop();
return arr;
},
- 数组合并
合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组
我的,我以为要自己原生态实现。
function concat(arr1, arr2) {
return arr1.concat(arr2);
}
作者的
concat: function(arr1, arr2) {
return arr1.concat(arr2);
}
- 添加元素
在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组
先用slice拷贝数组,再用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;
}
- 计数
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;
}
- 查找重复元素
找出数组 arr 中重复出现过的元素
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来判断熟悉也是应该的。
- 求二次方
为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
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;
}