您的当前位置:首页正文

javascript二分法(数组array)_javascript技巧

2023-12-02 来源:布克知识网

在Javascript中,我们可以通过prototype关键字为对象添加新的属性或者是方法,下面是一个为Array对象添加二分法查找功能的方法: 代码如下: Array.prototype.binarySearch = function(obj) { var value = 0; var left = 0; var right= this.length; while(left <= right) { var center = Math.floor((left+right)/2); if(this[center] == obj) { value = center; } if(obj < this[center]) { right = center - 1; } else { left = center + 1; } } alert(value); } //如下为测试代码: function testArrayBinarySearch() { var array = new Array(); var key = 678; var number = 1000; for (i = 0; i < number; i++) { array.push(i); } array.binarySearch(key); } window.onload = function() { testArrayBinarySearch(); } 下面是国外的代码 javascript二分法 //Copyright 2009 Nicholas C. Zakas. All rights reserved. //MIT-Licensed, see source file 代码如下: function binarySearch(items, value){ var startIndex = 0, stopIndex = items.length - 1, middle = Math.floor((stopIndex + startIndex)/2); while(items[middle] != value && startIndex < stopIndex){ //adjust search area(调整查找范围) if (value < items[middle]){ stopIndex = middle - 1; } else if (value > items[middle]){ startIndex = middle + 1; } //recalculate middle(重新计算中项索引) middle = Math.floor((stopIndex + startIndex)/2); } //make sure it's the right value(确保返回正确的值) return (items[middle] != value) ? -1 : middle; }

小编还为您整理了以下内容,可能对您也有帮助:

web前端javascript能实现什么算法或者计算

在Web开发中,JavaScript很重要,算法也很重要。下面整理了一下一些常见的算法在JavaScript下的实现,包括二分法、求字符串长度、数组去重、插入排序、选择排序、希尔排序、快速排序、冒泡法等等。仅仅是为了练手,不保证高效与美观,或许还有Bug,有时间再完善吧。

1.二分法:

function binary(items,value){

var startIndex=0,

stopIndex=items.length-1,

midlleIndex=(startIndex+stopIndex)>>>1;

while(items[middleIndex]!=value && startIndex

if(items[middleIndex]>value){

stopIndex=middleIndex-1;

}else{

startIndex=middleIndex+1;

}

middleIndex=(startIndex+stopIndex)>>>1;

}

return items[middleIndex]!=value ? false:true;

}

2.十六进制颜色值的随机生成:

function randomColor(){

var arrHex=["0","2","3","4","5","6","7","8","9","a","b","c","d"],

strHex="#",

index;

for(var i=0;i < 6; i++){

index=Math.round(Math.random()*15);

strHex+=arrHex[index];

}

return strHex;

}

一个求字符串长度的方法:

function GetBytes(str){

var len=str.length,

bytes=len;

for(var i=0;i < len;i++){

if(str.CharCodeAt>255){

bytes++;

}

}

return bytes;

}

3.js实现数组去重:

Array.protype.delRepeat=function(){

var newArray=new Array();

var len=this.length;

for(var i=0;i < len;i++){

for(var j=i+1;j < len;j++)

{

if(this[i]==this[j])

{

++i;

}

}

newArray.push(this[i]);

}

return newArray;

}

4.插入排序。所谓的插入排序,就是将序列中的第一个元素看成一个有序的子序列,然后不段向后比较交换比较交换。

function insertSort(arr){

var key;

for(var j = 1; j < arr.length ; j++){

//排好序的

var i = j - 1;

key = arr[j];

while(i >= 0 && arr[i] > key){

arr[i + 1] = arr[i];

i --;

}

arr[i + 1] = key;

}

return arr;

}

5.选择排序。其实基本的思想就是从待排序的数组中选择最小或者最大的,放在起始位置,然后从剩下的数组中选择最小或者最大的排在这公司数的后面。

function selectionSort(data)

{

var i, j, min, temp , count=data.length;

for(i = 0; i < count - 1; i++) {

/* find the minimum */

min = i;

for (j = i+1; j < count; j++)

{

if (data[j] < data[min])

{ min = j;}

}

/* swap data[i] and data[min] */

temp = data[i];

data[i] = data[min];

data[min] = temp;

}

return data;

}

6.希尔排序,也称递减增量排序算法。其实说到底也是插入排序的变种。

function shellSort(array){

var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; //

reverse()在维基上看到这个最优的步长较小数组

var i = 0;

var stepArrLength = stepArr.length;

var len = array.length;

var len2 = parseInt(len/2);

for(;i < stepArrLength; i++){

if(stepArr[i] > len2){

continue;

}

stepSort(stepArr[i]);

}

// 排序一个步长

function stepSort(step){

//console.log(step) 使用的步长统计

var i = 0, j = 0, f, tem, key;

var stepLen = len%step > 0 ? parseInt(len/step) + 1 : len/step;

for(;i < step; i++){// 依次循环列

for(j=1;/*j < stepLen && */step * j + i < len;

j++){//依次循环每列的每行

tem = f = step * j + i;

key = array[f];

while((tem-=step) >= 0){// 依次向上查找

if(array[tem] > key){

array[tem+step] = array[tem];

}else{

break;

}

}

array[tem + step ] = key;

}

}

}

return array;

}

7.快速排序。其实说到底快速排序算法就系对冒泡排序的一种改进,采用的就是算法理论中的分治递归的思想,说得明白点,它的做法就是:通过一趟排序将待排序的纪录分割成两部分,其中一部分的纪录值比另外一部分的纪录值要小,就可以继续分别对这两部分纪录进行排序;不段的递归实施上面两个操作,从而实现纪录值的排序。

function quickSort(arr,l,r){

if(l < r){

var mid=arr[parseInt((l+r)/2)],i=l-1,j=r+1;

while(true){

while(arr[++i] < mid);

while(arr[--j]>mid);

if(i>=j)break;

var temp=arr[i];

arr[i]=arr[j];

arr[j]=temp;

}

quickSort(arr,l,i-1);

quickSort(arr,j+1,r);

}

return arr;

}

8.冒泡法:

function bullSort(array){

var temp;

for(var i=0;i < array.length;i++)

{

for(var j=array.length-1;j > i;j--){

if(array[j] < array[j-1])

{

temp = array[j];

array[j]=array[j-1];

array[j-1]=temp;

}

}

}

return array;

}

几种javascript数组定义的方法详解

关于数组定义的方法大家了解多少?一般来说分为隐式创建、直接实例化、创建数组并指定长度、后来为了方便直接使用json格式定义数组,本文就和大家分享几种javascript数组定义的方法详解,希望能帮助到大家。

1、什么是数组

数组就是一组数据的集合

其表现形式就是内存中的一段连续的内存地址

数组名称其实就是连续内存地址的首地址

2、关于js中的数组特点

数组定义时无需指定数据类型

数组定义时可以无需指定数组长度

数组可以存储任何数据类型的数据(比如说一个元素保存整型,一个元素保存字符串型,这个在JS中是可以的)

创建数组的语法:

var arr=[值1,值2,值3]; //隐式创建

var arr=new Array(值1,值2,值3); //直接实例化

var array=new Array(size); //创建数组并指定长度

JS中符号含义:

()表示函数执行

[]表示语法模拟,表示模拟Array类的实例(=new Array())

{}表示语法模拟,表示模拟Object类的实例(=new Object())

//表示语法模拟(正则对象),表示模拟RegExp类的实例(=new RegExp())

3、关于数组长度

数组对象.length

在js中,每一个数组对象都可以调用length属性,它表示数组对象下共有几个数组元素

示例:

4、for...in语句

在js中,数组不是数据类型,数组的数据类型其实就是对象

Js中的For.....in语句可以实现对一个对象的所有属性的遍历

也可以使用for...in语句实现对一个数组的所有元素的遍历

语法:

for( var i in array ){

}

原理:数组中有几个元素,for..in语句就循环执行多少次

每次执行时,将当前数组元素的下标存放到变量i中

结果:

0:zhangsan

1:lisi

2:wangwu

3:xiaoqiang

5、文本下标

格式:

arr['key'] = value;

在js中,文本下标的数组元素,不计入数组长度

以文本下标形式添加到数组,实际是以属性形式添加到数组对象中的

结果:

3.zhangsan

lisi

遍历带有文本下标的数组:

结果:

0:1

1:2

2:3

first:zhangsan

second:lisi

6、数组

下面是脚本之家的补充

1.先定义再赋值

2.定义数组时同时赋值

varmyArray3 = new Array("脚","本","之","家");

//你需要在数组内指定数值或者逻辑值,那么变量类型应该是数值变量或者布尔变量,而不是字符变量

3、json格式的定义

不懂的同学可以查看这篇文章:http://www.gxlcms.com/article/20688.htm

Json定义用法和数组的区别

Json:是在javascript用来存数据的一种方法。

Json形式: var Json={a:1 , b:2 , c:3};

数组形式:var arr=[1,2,3];

Json个数组的区别:

1、Json的下标是字符串,如调用第一个数据时用:Json.a 。 数组的下标是数字如 arr[0]

2、Json没有length,数组有lengt

用Json来存数据,如果遇到需要循环需要用 for(元素变量 in 变量名){};因为Json没有length所以要用for in循环,for in循环可以用于Json和数组

for(i in Json){

语句

};

什么时候用for循环,什么时候用for in循环?

数组:用for循环 for(i=0,i<length,i++){};

Json:用for in循环 for(i in Json){};

4. 注意

· 数组只有数组长度一个属性

· 如果没有给数组赋值得到的是undefined,打印是”“

· 数组长度不够可以自动扩充,不存在越界的问题

您可能感兴趣的文章:js中的数组Array定义与sort方法使用示例

javascript中数组的多种定义方法和常用函数简介

javascript中数组的定义及使用实例

JavaScript自定义数组排序方法

JavaScript jQuery 中定义数组与操作及jquery数组操作

JavaScript数组的定义及数字操作技巧

javascript 数组的定义和数组的长度

javascript如何定义对象数组

JavaScript定义数组的三种方法(new Array(),new Array(''x'',''y'')

Web前端工程师应该知道的JavaScript使用小技巧

今天小编要跟大家分享的文章是关于Web前端工程师应该知道的JavaScript使用小技巧。任何一门技术在实际中都会有一些属于自己的小技巧。同样的,在使用JavaScript时也有一些自己的小技巧,只不过很多时候有可能容易被大家忽略。而在互联网上,时不时的有很多同行朋友会总结(或收集)一些这方面的小技巧。

今天在这篇文章中,小编会整理一些大家熟悉或不熟悉的有关于JavaScript的小技巧,希望能够对大家的学习和工作有所帮助。

一、数组

先来看使用数组中常用的一些小技巧。

01、数组去重

ES6提供了几种简洁的数组去重的方法,但该方法并不适合处理非基本类型的数组。对于基本类型的数组去重,可以使用...new

Set()来过滤掉数组中重复的值,创建一个只有唯一值的新数组。

constarray=[1,1,2,3,5,5,1]

constuniqueArray=[...newSet(array)];

console.log(uniqueArray);

>Result:(4)[1,2,3,5]

这是ES6中的新特性,在ES6之前,要实现同样的效果,我们需要使用更多的代码。该技巧适用于包含基本类型的数组:undefined、null、boolean、string和number。如果数组中包含了一个object,function或其他数组,那就需要使用另一种方法。

除了上面的方法之外,还可以使用Array.from(newSet())来实现:

constarray=[1,1,2,3,5,5,1]

Array.from(newSet(array))

>Result:(4)[1,2,3,5]

另外,还可以使用Array的.filter及indexOf()来实现:

constarray=[1,1,2,3,5,5,1]

array.filter((arr,index)=>array.indexOf(arr)===index)

>Result:(4)[1,2,3,5]

注意,indexOf()方法将返回数组中第一个出现的数组项。这就是为什么我们可以在每次迭代中将indexOf()方法返回的索引与当索索引进行比较,以确定当前项是否重复。

02、确保数组的长度

在处理网格结构时,如果原始数据每行的长度不相等,就需要重新创建该数据。为了确保每行的数据长度相等,可以使用Array.fill来处理:

letarray=Array(5).fill('');

console.log(array);

>Result:(5)["","","","",""]

03、数组映射

不使用Array.map来映射数组值的方法。

constarray=[

{

ame:'大漠',

email:'w3cplus@#'

},

{

ame:'Airen',

email:'airen@#'

}

]

constname=Array.from(array,({name})=>name)

>Result:(2)["大漠","Airen"]

04、数组截断

如果你想从数组末尾删除值(删除数组中的最后一项),有比使用splice()更快的替代方法。

例如,你知道原始数组的大小,可以重新定义数组的length属性的值,就可以实现从数组末尾删除值:

letarray=[0,1,2,3,4,5,6,7,8,9]

console.log(array.length)

>Result:10

array.length=4

console.log(array)

>Result:(4)[0,1,2,3]

这是一个特别简洁的解决方案。但是,slice()方法运行更快,性能更好:

letarray=[0,1,2,3,4,5,6,7,8,9];

array=array.slice(0,4);

console.log(array);

>Result:[0,1,2,3]

05、过滤掉数组中的falsy值

如果你想过滤数组中的falsy值,比如0、undefined、null、false,那么可以通过map和filter方法实现:

constarray=[0,1,'0','1','大漠','#',undefined,true,false,null,'undefined','null',NaN,'NaN','1'+0]

array.map(item=>{

returnitem

}).filter(Boolean)

>Result:(10)[1,"0","1","大漠","#",true,"undefined","null","NaN","10"]

06、获取数组的最后一项

数组的slice()取值为正值时,从数组的开始处截取数组的项,如果取值为负整数时,可以从数组末属开始获取数组项。

letarray=[1,2,3,4,5,6,7]

constfirstArrayVal=array.slice(0,1)

>Result:[1]

constlastArrayVal=array.slice(-1)

>Result:[7]

console.log(array.slice(1))

>Result:(6)[2,3,4,5,6,7]

console.log(array.slice(array.length))

>Result:[]

正如上面示例所示,使用array.slice(-1)获取数组的最后一项,除此之外还可以使用下面的方式来获取数组的最后一项:

console.log(array.slice(array.length-1))

>Result:[7]

07、过滤并排序字符串列表

你可能有一个很多名字组成的列表,需要过滤掉重复的名字并按字母表将其排序。

在我们的例子里准备用不同版本语言的JavaScript

保留字的列表,但是你能发现,有很多重复的关键字而且它们并没有按字母表顺序排列。所以这是一个完美的字符串列表(数组)来测试我们的JavaScript小知识。

varkeywords=['do','if','in','for','new','try','var','case','else','enum','null','this','true','void','with','break','catch','class','const','false','super','throw','while','delete','export','import','return','switch','typeof','default','extends','finally','continue','debugger','function','do','if','in','for','int','new','try','var','byte','case','char','else','enum','goto','long','null','this','true','void','with','break','catch','class','const','false','final','float','short','super','throw','while','delete','double','export','import','native','public','return','static','switch','throws','typeof','boolean','default','extends','finally','package','private','abstract','continue','debugger','function','volatile','interface','protected','transient','implements','instanceof','synchronized','do','if','in','for','let','new','try','var','case','else','enum','eval','null','this','true','void','with','break','catch','class','const','false','super','throw','while','yield','delete','export','import','public','return','static','switch','typeof','default','extends','finally','package','private','continue','debugger','function','arguments','interface','protected','implements','instanceof','do','if','in','for','let','new','try','var','case','else','enum','eval','null','this','true','void','with','await','break','catch','class','const','false','super','throw','while','yield','delete','export','import','public','return','static','switch','typeof','default','extends','finally','package','private','continue','debugger','function','arguments','interface','protected','implements','instanceof'];

因为我们不想改变我们的原始列表,所以我们准备用高阶函数叫做filter,它将基于我们传递的回调方法返回一个新的过滤后的数组。回调方法将比较当前关键字在原始列表里的索引和新列表中的索引,仅当索引匹配时将当前关键字push到新数组。

最后我们准备使用sort方法排序过滤后的列表,sort只接受一个比较方法作为参数,并返回按字母表排序后的列表。

在ES6下使用箭头函数看起来更简单:

constfilteredAndSortedKeywords=keywords

.filter((keyword,index)=>keywords.lastIndexOf(keyword)===index)

.sort((a,b)=>a这是最后过滤和排序后的JavaScript保留字列表:

console.log(filteredAndSortedKeywords);

>Result:['abstract','arguments','await','boolean','break','byte','case','catch','char','class','const','continue','debugger','default','delete','do','double','else','enum','eval','export','extends','false','final','finally','float','for','function','goto','if','implements','import','in','instanceof','int','interface','let','long','native','new','null','package','private','protected','public','return','short','static','super','switch','synchronized','this','throw','throws','transient','true','try','typeof','var','void','volatile','while','with','yield']

08、清空数组

如果你定义了一个数组,然后你想清空它。通常,你会这样做:

letarray=[1,2,3,4];

functionemptyArray(){

array=[];

}

emptyArray();

但是,这有一个效率更高的方法来清空数组。你可以这样写:

letarray=[1,2,3,4];

functionemptyArray(){

array.length=0;

}

emptyArray();

09、拍平数组

使用...运算符,将数组拍平:

10、从数组中获取最大值和最小值

可以使用Math.max和Math.min取出数组中的最大小值和最小值:

constnumbers=[15,80,-9,90,-99]

constmaxInNumbers=Math.max.apply(Math,numbers)

constminInNumbers=Math.min.apply(Math,numbers)

console.log(maxInNumbers)

>Result:90

console.log(minInNumbers)

>Result:-99

另外还可以使用ES6的...运算符来完成:

constnumbers=[1,2,3,4];

Math.max(...numbers)

>Result:4

Math.min(...numbers)

>>Result:1

二、对象

在操作对象时也有一些小技巧。

01、使用...运算符合并对象或数组中的对象

同样使用ES的...运算符可以替代人工操作,合并对象或者合并数组中的对象。

//合并对象

constobj1={

ame:'大漠',

url:'#'

}

constobj2={

ame:'airen',

age:30

}

constmergingObj={...obj1,...obj2}

>Result:{name:"airen",url:"#",age:30}

//合并数组中的对象

constarray=[

{

ame:'大漠',

email:'w3cplus@#'

},

{

ame:'Airen',

email:'airen@#'

}

]

constresult=array.rece((accumulator,item)=>{

return{

...accumulator,

[item.name]:item.email

}

},{})

>Result:{大漠:"w3cplus@#",Airen:"airen@#"}

02、有条件的添加对象属性

不再需要根据一个条件创建两个不同的对象,以使它具有特定的属性。为此,使用...操作符是最简单的。

constgetUser=(emailIncluded)=>{

return{

ame:'大漠',

blog:'w3cplus',

...emailIncluded&&{email:'w3cplus@#'}

}

}

constuser=getUser(true)

console.log(user)

>Result:{name:"大漠",blog:"w3cplus",email:"w3cplus@#"}

constuserWithoutEmail=getUser(false)

console.log(userWithoutEmail)

>Result:{name:"大漠",blog:"w3cplus"}

03、解构原始数据

你可以在使用数据的时候,把所有数据都放在一个对象中。同时想在这个数据对象中获取自己想要的数据。

在这里可以使用ES6的Destructuring特性来实现。比如你想把下面这个obj中的数据分成两个部分:

constobj={

ame:'大漠',

blog:'w3cplus',

email:'w3cplus@#',

joined:'2019-06-19',

followers:45

}

letuser={},userDetails={}

({name:user.name,email:user.email,...userDetails}=obj)

>{name:"大漠",blog:"w3cplus",email:"w3cplus@#",joined:"2019-06-19",followers:45}

console.log(user)

>Result:{name:"大漠",email:"w3cplus@#"}

console.log(userDetails)

>Result:{blog:"w3cplus",joined:"2019-06-19",followers:45}

04、动态更改对象的key

在过去,我们首先必须声明一个对象,然后在需要动态属性名的情况下分配一个属性。在以前,这是不可能以声明的方式实现的。不过在ES6中,我们可以实现:

constdynamicKey='email'

letobj={

ame:'大漠',

blog:'w3cplus',

[dynamicKey]:'w3cplus@#'

}

console.log(obj)

>Result:{name:"大漠",blog:"w3cplus",email:"w3cplus@#"}

05、判断对象的数据类型

使用Object.prototype.toString配合闭包来实现对象数据类型的判断:

constisType=type=>target=>`[object${type}]`===Object.prototype.toString.call(target)

constisArray=isType('Array')([1,2,3])

console.log(isArray)

>Result:true

上面的代码相当于:

functionisType(type){

returnfunction(target){

return`[object${type}]`===Object.prototype.toString.call(target)

}

}

isType('Array')([1,2,3])

>Result:true

或者:

constisType=type=>target=>`[object${type}]`===Object.prototype.toString.call(target)

constisString=isType('String')

constres=isString(('1'))

console.log(res)

>Result:true

06、检查某对象是否有某属性

当你需要检查某属性是否存在于一个对象,你可能会这样做:

varobj={

ame:'大漠'

}

if(obj.name){

console.l

JAVAscript的数组arr怎么用啊

var arr = new Array();//申明一个无长度的arr数组,也可以这样:

//一维数组var arr = new Array("1","5","3"),

//二维数组,var arr = new Array(['1','2'],['3','4'])。还可以这样

//var arr=[1,2,3,4,5,6,7,8,9];

arr[0] = 1;arr[2] = 5;arr[3] = 3;//进行赋值

for(var i = 0; i < arr.length - 1; i++) {//进行从大到小的排序

for(var j = 1; j < arr.length; j++) {

if(arr[i] < arr[j]) {

var temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

}

alert(arr.join("<"));//提示框中提示arr数组中的所有项且把没个元素用‘<’链接起来的字符

//串,其结果为:5<3<1。join(str)函数是把数组中的元素用str连接起来成

//字符串

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

Top