JavaScript数组基础编程题归纳
之前的随笔“JavaScript中数组类型的属性和方法”中有介绍很多数组类型的方法,但都是一些理论。最近在练习在线编程题,发现自己还是习惯于用常规的循环来答题,对于数组的方法的使用还是不够熟练。这次笔记归纳了一下基础的数组编程题,意在加深对数组各种方法的印象,以便理解使用。
1.计算给定数组arr所有元素的和(number类型)
常规循环
function sum(arr) {
var s = 0;
for (var i=arr.length-1; i>=0; i--) {
s += arr[i];
}
return s;
}forEach()遍历
function sum(arr) {
var s = 0;
arr.forEach(function(val, idx, arr) {
s += val;
}, 0);
return s;
};reduce()归并
function sum(arr) {
return arr.reduce(function(prev, curr, idx, arr){
return prev + curr;
});
}eval()与join()
function sum(arr) {
return eval(arr.join("+"));
};
2.移除指定数组arr中所有与item相等的元素
不修改arr
//创建新数组,push()
function remove(arr, item) {
var result = [];
for(var i = 0; i < arr.length; i++){
if(arr[i] != item){
result.push(arr[i]);
}
}
return result;
} // filter()迭代
function remove(arr, item) {
return arr.filter(function(x) { return x !== item; });
}直接修改arr
function removeWithoutCopy(arr, item) {
for(var i = 0; i < arr.length; i++){
if(arr[i] == item){
arr.splice(i,1);
i--;
}
}
return arr;
}
3.在数组arr指定位置添加元素item(不修改arr)
在数组开头添加
//****复制数组再添加(concat/slice + unshift/splice)****
function prepend(arr, item) {
var result = arr.concat(); //var result = arr.slice(0);
result.unshift(item); //result.splice(0,0,item);
return result;
} //*****直接拼接**** //利用concat
function prepend(arr, item) {
return [item].concat(arr);
} //使用push.apply
function prepend(arr, item) {
var newArr=[item];
[].push.apply(newArr, arr);
return newArr;
}在数组末尾添加
//普通的迭代拷贝
var append = function(arr, item) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
newArr.push(arr[i]);
}
newArr.push(item);
return newArr;
}; // 使用slice浅拷贝+push组合
var append2 = function(arr, item) {
var newArr = arr.slice(0); // slice(start, end)浅拷贝数组
newArr.push(item);
return newArr;
}; //使用concat将传入的数组或非数组值与原数组合并,组成一个新的数组并返回
var append3 = function(arr, item) {
return arr.concat(item);
};在数组index处添加
//复制数组,在添加
function insert(arr, item, index) {
var newArr=arr.concat(); //var newArr=arr.slice(0);
//var newArr=[]; [].push.apply(newArr, arr);
newArr.splice(index,0,item);
return newArr;
} //利用slice+concat
function insert(arr, item, index) {
return arr.slice(0,index).concat(item,arr.slice(index));
}
4.在数组arr指定位置删除元素(不修改arr)
删除数组开头元素
//复制,再删除
function curtail(arr) {
var newArr = arr.concat(); //var newArr = arr.join().split(',');
//var newArr=[]; [].push.apply(newArr, arr);
newArr.shift();
return newArr;
} //利用filter
function curtail(arr) {
return arr.filter(function(v,i) {
return i!==0;
});
} //利用slice
function curtail(arr) {
return arr.slice(1);
}删除数组末尾元素
function truncate(arr) {
return arr.slice(0,arr.length-1);
}
5.合并数组(不修改arr)
利用concat()
function concat(arr1, arr2) {
return arr1.concat(arr2);
}利用 splice + push.apply
function concat(arr1, arr2) {
var newArr=arr1.slice(0);
[].push.apply(newArr, arr2);
return newArr;
}
6.统计数组arr中元素item出现的次数
常规循环
function count(arr, item) {
var sum = 0;
for(var i = 0; i < arr.length; i++){
if( arr[i] == item){
sum ++;
}
}
return sum;
}利用filter()
function count(arr, item) {
return arr.filter(function(x){
return (x==item);
}).length
}利用forEach()
function count(arr, item) {
var count = 0;
arr.forEach(function(x) {
x === item ? count++ : 0;
});
return count;
}利用reduce()
function count(arr, item) {
var count = arr.reduce(function(prev, curr) {
return curr === item ? prev+1 : prev;
}, 0);
return count;
}
7.输出数组arr中重复出现过的元素
双循环
function duplicates(arr) {
var result = [];
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
result.push(arr[i]);
arr.splice(i,1);
arr.splice(j,1);
i=i-2;
j=j-2;
}
}
}
return result;
}先排序,再循环
function duplicates(arr) {
var copy = arr.sort(),
result = [];
for(var i in copy){
if(copy[i]==copy[i-1] && result.indexOf(copy[i])==-1) result.push(copy[i]);
}
return result;
}利用forEach()
function duplicates(arr) {
var result = [];
arr.forEach(function(elem){
if(arr.indexOf(elem) != arr.lastIndexOf(elem) && result.indexOf(elem) == -1){
result.push(elem);
}
});
return result;
}
8.数组去重
Array.prototype.uniq = function () {
var flag = false;
for(var i = 0; i < this.length; i++){
if(this[i] !== this[i]) flag = true;
for(var j = i+1; j < this.length;){
if(this[i] === this[j] ||(flag && this[j] !== this[j])){
this.splice(j,1);
}else{
j++;
}
}
}
return this;
}
JavaScript数组基础编程题归纳的更多相关文章
- #学习笔记#——JavaScript 数组部分编程(一)
来自牛客网的js编程题 1.移除数组 arr 中的所有值与 item 相等的元素.不要直接修改数组 arr,结果返回新的数组 function remove(arr, item) { if(!Arra ...
- java基础编程题练习(一)
1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...
- 《ACM国际大学生程序设计竞赛题解Ⅰ》——基础编程题
这个专栏开始介绍一些<ACM国际大学生程序设计竞赛题解>上的竞赛题目,读者可以配合zju/poj/uva的在线测评系统提交代码(今天zoj貌似崩了). 其实看书名也能看出来这本书的思路,就 ...
- java面向对象基础编程题
第一题: 设计一个形状类Shape,方法:求周长和求面积.形状类的子类:Rect(矩形),Circle(圆形).Rect类的子类:Square(正方形).不同的子类会有不同的计算周长和面积的方法1.总 ...
- #学习笔记#——JavaScript 数组部分编程(七)
24.柯里化 首先想解释一下,“柯里化”的意思, [在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结 ...
- java基础编程题(1)
1. 题目:打印出杨辉三角形(要求打印出10行如下图) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1...... package com.jzq.test1; ...
- PAT 基础编程题 4-11 求自定类型元素序列的中位数(希尔排序)
4-11 求自定类型元素序列的中位数 (25分) 本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第\lfloor N/2 +1\rfloor⌊N/2+1⌋大的元素.其中集合元素的类型 ...
- JavaScript数组基础及实例
js数组 和var i=1;这样的简单存储一样是js中的一种数据结构,是专门用来存储多个数据的一种数据结构. 摘:数组是一组数据的集合,其表现形式就是内存中的一段连续的内存地址,数组名称其实就是连续内 ...
- JavaScript 数组基础知识
// Array 类型: // 检测数组: // console.log(myarr instanceof Array) //true // toString()方法会返回由数组中每个值的字符串形式拼 ...
随机推荐
- Activiti工作流(二)之常用操作
前面介绍了Activiti工作流的基本操作,但是在实际应用过程中,往往不满足项目需求,因此还需要了解一些其他的功能比如:连线.排他网关.并行网管.流程变量.个人任务及组任务的三种发布方式. 下面将介绍 ...
- 在Eclipse上通过插件获取github上的spring源码
spring源码开始的时候是通过SVN来管理代码的,后来是转移到github上管理源码的,可以通过在github上直接下载spring的源码. 下面讲解如何通过在eclipse上的插件git来获取sp ...
- Flume-ng源码解析之启动流程
今天我们通过阅读Flume-NG的源码来看看Flume的整个启动流程,废话不多说,翠花,上源码!! 1 主类也是启动类 在这里我贴出Application中跟启动有关的方法,其他你们可以自己看源码,毕 ...
- python学习笔记(一)元组tuple
元组由简单的对象组构成,元组与列表相似,但是元组不能在原处修改.元组位置有序的对象集合,元组通过偏移来访问. 为什么有了列表还要元组?元组的不变性提供了某种完整性,可以确保元组在程序中不被另一个引用修 ...
- 2017,科学使用strace神器(附代码,举栗子)
我感到惊讶,都2017年了,几乎没有人知道他们可以使用strace的了解所有事情.它总是我拔出的第一个调试工具之一,因为它通常在我运行的Linux系统上可用,并且它可以用于解决各种各样的问题. 什么是 ...
- 20170305Meetup Git、heroku drop db
Rails中,给link_to添加上action和class样式,内部文本 <%= link_to product_path(product),{ :controller => 'cont ...
- Objective-C日记-Bounds和Frame
今天在学习有关UIView时,关于Bounds和Frame的问题困扰多时,今日研究了一翻,有所收获,遂记之. 一.问题来源 网上有关bounds和frames的比较的文章主要就是一篇:http://b ...
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...
- 2659: [Beijing wc2012]算不出的算式
2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 757 Solved: 425[Submit] ...
- 用php+mysql+ajax+jquery做省市区三级联动
要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下拉跟着变化,市级下拉变化时区下拉跟着变化. 使用chinastates ...