JavaScript算法练习:Slasher Flick

简单点说就是对所给的数组做截取操作。看上去就是对数组做数组元素的删除,可能你会想到数组中的shift()方法,可是这个方法只能删除数组的第一个元素。而我们要实现的功能是:对所给数组,根据第二个参数进行截取操作,如果第二个参数大于数组的长度,则返回一个空数组,否则将返回第二个参数作为索引值之后的所有元素组成的数组。

在JavaScript中这样来实现。创建一个slasher()函数,并且给这个函数传递两个参数arrhowMany。然后返回截取后的数组:

function slasher(arr, howMany) {
    // 这里添加处理方法

    return arr;
}

实现思路

根据前面所说的,实现slasher()的思路:

  • 如果howMany等于0,返回原数组arr
  • 如果howMany大于等于arr.length,使用数组的方法将arr内的所有项目删除,将返回一个空数组[]
  • 其他情况,从arr中删除从第一个元素算起到howMany指的元素,返回一个新数组

实现这些功能,可以使用数组中的shift()slice()splice()方法。简单回忆一下:

比如:

var arr = [1,2,3,4,5,6,7,8,9];
console.log(arr.shift()); // 1
console.log(arr.slice(0,3)); // [1, 2, 3]
console.log(arr.splice(0,3)); // [1, 2, 3]

实现方案

文章开头也提到过了,实现slasher()函数功能,通过数组的shift()slice()splice()方法都可以实现。接下来,看看这几种方法是如何实现的。

方法1: shift()

数组shift()方法删除数组的第一个元素,其实这个离我们需要的删除数组howMany个元素,相距甚远。似乎无法实现一样,其实不然,配合for循环就能达到我们需要的功能:

function slasher(arr, howMany) {
    for (var i= 0; i < howMany; i++){
        arr.shift();
        // arr = [1,2,3,4,5,6,7,8,9] howMany=3
        // 遍历次数 i=? i<howMany  i++  arr.shift()  arr
        // 1st     0    yes        1    1          [2,3,4,5,6,7,8,9]
        // 2nd     1    yes        2    2          [3,4,5,6,7,8,9]
        // 3rd     2    yes        3    3          [4,5,6,7,8,9]
        // 4th     3    no
    }
    return arr;
}

slasher([1,2,3,4,5,6,7,8,9],3);  // [4, 5, 6, 7, 8, 9]
slasher([1,2,3,4,5,6,7,8,9],0);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]
slasher([1,2,3,4,5,6,7,8,9],10); // []

方法2:slice()

slice()方法可以截取数组中的一部分元素,并且将这些元素存入到一个新的数组对象中。并且返回这个新数组。如此一来,在slasher()函数中,可以这样做:

  • 如果howMany等于0,将返回原数组arr
  • 如果howMany大于等于arr.lengtharr.slice(arr.length)arr中取不到元素,将返回一个空数组[]
  • 其他情况,arr.slice()arr内的元素第-arr.length + howMany算起到数组最后一个元素截取,并返回

那么slasher()函数就可以这样写:

function slasher(arr, howMany) {
    var len = arr.length;
    if (howMany === 0) {
        return arr;
    } else if (howMany >= len) {
        return arr.slice(len);
    } else {
        return arr.slice(-len + howMany);
    }
}

slasher([1,2,3,4,5,6,7,8,9],0);  //[1, 2, 3, 4, 5, 6, 7, 8, 9]
slasher([1,2,3,4,5,6,7,8,9],10); // []
slasher([1,2,3,4,5,6,7,8,9],4);  //[5, 6, 7, 8, 9]

方法3: splice()

splice()方法可以指定从数组中第几个元素开始删除多少个元素,然后返回这个修改后的数组。即:

  • 如果howMany等于0,将返回原数组arr
  • 如果howMany大于等于arr.length,使用Array.splice()arr內的所有元素刪除,将返回一个空数组[]
  • 其他情況,使用Array.splice()arr內的元素从第一个元素算起到howMany指定的元素,并且返回修改后的数组

代码如下:

function slasher (arr, howMany) {
    var len =  arr.length;
    if (howMany === 0) {
        return arr;
    } else if (howMany >= len) {
        arr.splice(0, len);
        return arr;
    } else {
        arr.splice(0, howMany);
        return arr;
    }
}

slasher([1,2,3,4,5,6,7,8,9],0);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]
slasher([1,2,3,4,5,6,7,8,9],10); // []
slasher([1,2,3,4,5,6,7,8,9],4);  // [5, 6, 7, 8, 9]

总结

文章分别使用数组的Array.shift()Array.slice()Array.splice()方法实现对所给数组,根据第二个参数进行截取操作,如果第二个参数大于数组的长度,则返回一个空数组,否则将返回第二个参数作为索引值之后的所有元素组成的数组。

时间: 2024-08-17 13:01:32

JavaScript算法练习:Slasher Flick的相关文章

关于JavaScript算法的几个小练习--DonyZ

各位小伙伴们,以下的内容来自于我在freecodecamp上做的练习,这是一个很好的学习平台,在此分享给大家,下面的题目答案在文章的最后(答案都是我自己写的,虽然都写出来了,可并不一定是最好的写法,所以希望能和大家一起交流,嘿嘿),并且会持续更新关于JavaScript算法的文章,希望小伙伴们能多多交流,互相学习 1.翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串. 例如:reverseString("hello

Javascript算法系列之快速排序(Quicksort)

Javascript算法系列之快速排序(Quicksort) 原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gist.github.com/paullewis/1981455#file-gistfile1-js 快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格 核心的思想就是通过一趟排序将要排序的数据分割成独立的

JavaScript算法题之–随机数的生成

JavaScript算法题之–随机数的生成 需求描述:从一组有序的数据中生成一组随机并且不重复的数,类似于简单的抽奖程序的实现. 先来生成一个有序的数组: 1 var arr = [], 2     length = 100, 3     i = 0; 4   5 for( ; i < length; i++ ){ 6     arr.push( i ); 7 } 从一个长度为 100 的有序数组中随机拿出 10 个随机的数,并且不能有重复. 方法1:随机抽取法 01 var gRandomAr

FCC JS基础算法题(8):Slasher Flick(截断数组)

题目描述: 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这个题目有两个方法,都比较简单,用slice方法: function slasher(arr, howMany) { // 请把你的代码写在这里 var newArr = []; newArr = arr.slice(howMany); return newArr; } slasher([1, 2, 3], 2); 然后是用splice方法: function slasher(arr, howMany) { // 请把你的

javascript算法挑战

1.翻转字符串算法挑战: 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. 你的结果必须得是一个字符串 function reverseString(str) { arr = str.split(''); str = arr.reverse().join(''); return str; } reverseString("hello"); 2.阶乘算法挑战: 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成

JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行. 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用

JavaScript算法(归并排序与快速排序)

归并排序与快速排序这两个算法放在一起,也是因为时间复杂度都是对数级别的. 目前看过的资料,归并排序看<学习JavaScript数据结构与算法>介绍的归并排序吧,快速排序直接看百度百科,讲的不错.通过这两份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 和之前的一样,嗯,<学习JavaScript数据结构与算法>这本书里都有现成ES5代码,就不在这儿写了,关键是弄清楚原理,然后JS代码每天写两遍,就OK了.ES6的代码周五之

FCC上的javascript算法题之中级篇

FCC中的javascript中级算法题解答 中级算法的题目中用到了很多js的知识点,比如迭代,闭包,以及对json数据的使用等等,现在将自己中级算法的解答思路整理出来供大家参考讨论.欢迎大家提出新的思路,写出更简单的解法. 1.给一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 说明:最小的数字并非总在最前面 如:sumAll([4, 1]) 应该返回 10. sumAll([5, 10]) 应该返回 45. function sumAll(arr) { var max=Math

JavaScript算法(冒泡排序、选择排序与插入排序)

冒泡排序.选择排序与插入排序复杂度都是指数级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看<计算机科学概论(第三版)>里介绍的选择排序,插入排序看<计算机科学概论(第11版)>里介绍的插入排序, 通过这三份资料弄明白实现原理之后,最后看<学习JavaScript数据结构与算法>一书里的JS实现代码. 嗯,这本书里都有现成代码,就不在这儿写了,关键是弄清楚原理,然后