前言
【筆記內容】
- 關于JSchallenger中Arrays物件題目的復盤
- 本人的提交、以及做題時的思路
- 分析作者答案
- 涉及的知識快速了解,注意:并不深入分析具體知識,只是圍繞題目展開
【筆記目的】
- 幫助本人進一步了解Javascript的Arrays物件以及涉及的方法
- 對自己做題后的復盤,進一步了解自己的不足之處
【相關資源】
- JSchallenger
【溫馨提示】
- 筆記中有些個人理解后整理的筆記,可能有所偏差,也懇請讀者幫忙指出,謝謝,
- 若是有其他的解題方法也請讀者分享到評論區,一起學習,共同進步,謝謝,
- 我的提交有不足之處也懇請讀者幫忙指出,不吝賜教,謝謝,
Array物件快速了解
- 用于構造陣列的全域物件
- JavaScript 陣列的長度和元素型別都是非固定的,
- 只能用整數作為陣列元素的索引,而不能用字串,
【PS】什么是陣列?
- 類似于串列的高階物件,

常見操作
| 方法 | 描述 |
|---|---|
let arr=[陣列元素1,...,陣列元素n] |
創建陣列 |
let el=arr[索引] |
通過索引訪問陣列元素 |
| arr.forEach(function(item,index,array)){} | 遍歷陣列 |
arr.push(添加元素) |
添加元素到陣列的末尾 |
| arr.pop() | 洗掉陣列末尾的元素 |
| arr.shift() | 洗掉陣列頭部元素 |
arr.push(目標元素) |
arr.indexOf(目標元素) |
| arr.splice(,) | 通過索引洗掉某個元素 |
| let shallowCopy = arr.slice() | 復制一個陣列 |
了解更多
JSchallenger-Arrays
Get nth element of array
需求:
Write a function that takes an array (a) and a value (n) as argument
Return the nth element of 'a'
我的提交(作者答案)
function myFunction(a, n) {
return a[n - 1];
}
涉及知識(訪問陣列元素)
訪問陣列元素
- 陣列的索引是從0開始的,第一個元素的索引為0,最后一個元素的索引等于該陣列的
length減1, - 指定的索引是一個無效值,回傳
undefined
格式
arr[index]
index:訪問陣列元素目標索引
了解更多
Remove first n elements of an array
需求:
Write a function that takes an array (a) as argument
Remove the first 3 elements of 'a'
Return the result
我的提交(作者答案)
function myFunction(a) {
return a.slice(3);
}
涉及知識(slice()方法)
Array.prototype.slice()
- 回傳一個新的由
begin和end決定的原陣列的淺拷貝陣列物件 - 原始陣列不會被改變
- 會提取原陣列中索引從
begin到end的所有元素(包含begin,但不包含end)
格式
arr.slice([begin[, end]])
begin(提取起始處的索引):可選
- 省略:默認從
0開始 - 負數:從原陣列中的倒數第幾個元素開始提取,到最后一個元素(包含最后一個元素),
- 超出原陣列的索引范圍:回傳空陣列
end(提取終止處的索引):可選
- 負數:在原陣列中的倒數第幾個元素結束抽取,到最后一個元素(不包含最后一個元素)
- 省略:會一直提取到原陣列末尾,
- 大于陣列的長度:也會一直提取到原陣列末尾,
回傳值:一個含有被提取元素的新陣列,
了解更多
Get last n elements of an array
需求:
Write a function that takes an array (a) as argument
Extract the last 3 elements of a
Return the resulting array
我的提交(作者答案)
function myFunction(a) {
return a.slice(-3);
}
涉及知識(slice()方法)
Array.prototype.slice()
點擊此處跳轉
Get first n elements of an array
需求:
Write a function that takes an array (a) as argument
Extract the first 3 elements of a
Return the resulting array
我的提交(作者答案)
function myFunction(a) {
return a.slice(0, 3);
}
涉及知識(slice()方法)
Array.prototype.slice()
點擊此處跳轉
Return last n array elements
需求:
Write a function that takes an array (a) and a number (n) as arguments
It should return the last n elements of a
我的提交(作者答案)
function myFunction(a, n) {
return a.slice(-n);
}
涉及知識(slice()方法)
Array.prototype.slice()
點擊此處跳轉
Remove a specific array element
需求:
Write a function that takes an array (a) and a value (b) as argument
The function should clean a from all occurrences of b
Return the filtered array
我的提交(作者答案)
function myFunction(a, b) {
return a.filter(item => item !== b);
}
涉及知識(filter()方法,箭頭函式)
array.filter()方法
- 創建一個新的陣列,新陣列中的元素是通過檢查指定陣列中符合條件的所有元素,
- 不會對空陣列進行檢測,
- 不會改變原始陣列,
格式(注意該格式不完整,之針對本題的格式)
array.filter(function(currentValue))
function(currentValue):必需,函式,陣列中的每個元素都會執行這個函式
currentValue:必需,當前元素的值
回傳值:陣列,
- 包含了符合條件的所有元素,
- 沒有符合條件的元素:回傳空陣列,
了解更多
箭頭函式
- 使函式運算式更簡潔
- 更適用于那些本來需要匿名函式的地方
- 它不能用作建構式
格式
(param1, param2, …, paramN) => expression
(param1, param2, …, paramN) => { statements }
//相當于:(param1, param2, …, paramN) =>{ return expression; }
param:引數
expression:運算式
| 其他格式 | 前提 |
|---|---|
| singleParam => { statements } | 當只有一個引數時,圓括號是可選的: |
| () => { statements } | 沒有引數的函式應該寫成一對圓括號, |
了解更多
Count number of elements in JavaScript array
需求:
Write a function that takes an array (a) as argument
Return the number of elements in a
我的提交(作者答案)
function myFunction(a) {
return a.length;
}
涉及知識(array.length)
Array.length
- 是
Array的實體屬性,值是一個 0 到 2^32 - 1 的整數 - 回傳或設定一個陣列中的元素個數
了解更多
Count number of negative values in array
需求:
Write a function that takes an array of numbers as argument
Return the number of negative values in the array
我的提交
function myFunction(a){
var count=0;
for(var i=0;i<a.length;i++){
if(a[i]<0){
count++;
}
}
return count;
}
作者答案
function myFunction(a) {
return a.filter((el) => el < 0).length;
}
涉及知識(array.filter()方法、箭頭函式)
array.filter()方法
點擊此處跳轉
箭頭函式
點擊此處跳轉
Sort an array of numbers in descending order
需求:
Write a function that takes an array of numbers as argument
It should return an array with the numbers sorted in descending order
我的提交
function myFunction(arr) {
arr1=arr.sort();
return arr1.reverse();
}
作者答案
function myFunction( arr ) {
return arr.sort((a, b) => b - a)
}
涉及知識(array.sort()方法、array.reverse()方法、箭頭函式)
Array.prototype.sort()
- 排列陣列,排序順序可以是按字母或數字,也可以是升序(向上)或降序(向下),
- 默認將按字母和升序將值作為字串進行排序,
- 在對數字字串進行排序時會產生不正確的結果,(如"25" >"100",因為2>1)
- 會改變原始陣列
格式(注意該格式不完整,之針對本題的格式)
arr.sort([compareFunction])
compareFunction(指定按某種順序進行排列的函式):可選,
-
省略:元素按照轉換為的字串的各個字符的Unicode位點進行排序
-
指明了
compareFunction:陣列會按照呼叫該函式的回傳值排序compareFunction(a, b)的a-b a、b相對位置 小于 0 a 會被排列到 b 之前(順序) 等于 0 位置不變 大于 0 b 會被排列到 a 之前(逆序)
回傳值:陣列
- 排序后的陣列(陣列已原地排序,并且不進行復制)
了解更多
Array.prototype.reverse()
- 將陣列中元素的位置顛倒,,并回傳該陣列,
- 會改變原陣列,
格式
arr.reverse()
回傳值:顛倒后的陣列,
箭頭函式
點擊此處跳轉
Sort an array of strings alphabetically
需求:
Write a function that takes an array of strings as argument
Sort the array elements alphabetically
Return the result
我的提交(作者答案)
function myFunction(arr) {
return arr.sort();
}
涉及知識(字母排序方法)
字母排序方法
使用Array.prototype.sort()方法排序
點擊此處跳轉
Return the average of an array of numbers
需求:
Write a function that takes an array of numbers as argument
It should return the average of the numbers
我的提交
function myFunction(arr){
var sum=0;
for(var i=0;i<arr.length;i++){
sum+=arr[i];
}
return sum/arr.length;
}
作者答案
function myFunction( arr ) {
return arr.reduce((acc, cur) => acc + cur, 0) / arr.length
}
涉及知識(reduce()方法、箭頭函式)
Array.prototype.reduce()
- 接收一個函式作為累加器,陣列中的每個值(從左到右)開始縮減,最終計算為一個值,
- 對于空陣列是不會執行回呼函式的
格式(注意該格式不完整,之針對本題的格式)
array.reduce(function(total, currentValue))
function(total,currentValue)(用于執行每個陣列元素的函式):必需,
total(初始值, 或者計算結束后的回傳值):必需,currentValue(當前元素):必需,
回傳值:計算結果
了解更多
箭頭函式
點擊此處跳轉
Return the longest string from an array of strings
需求:
Write a function that takes an array of strings as argument、
Return the longest string
我的提交
function myFunction(arr) {
var max;
for(var i=0;iarr[i+1].length){
max=arr[i];
}else{
max=arr[i+1];
}
}
return max;
}
作者答案
function myFunction( arr ) {
return arr.reduce((a, b) => a.length <= b.length ? b : a)
}
涉及知識(reduce()方法、箭頭函式、三目運算子)
Array.prototype.reduce()
點擊此處跳轉
箭頭函式
點擊此處跳轉
三目運算子
格式
expression ? sentence1 : sentence2
-
expression:判斷運算式 -
sentence1:值為true時,執行陳述句 -
sentence2:值為false時,執行陳述句 -
類似于if陳述句:
if(expression){ sentence1; }else{ sentence2; }
Check if all array elements are equal
需求:
Write a function that takes an array as argument
It should return true if all elements in the array are equal
It should return false otherwise
我的提交
function myFunction(arr) {
return arr.every(item=>item ===arr[0]);
}
作者答案
function myFunction( arr ) {
return new Set(arr).size === 1
}
涉及知識(every()方法、set().size方法、相等運算子)
Array.prototype.every()
- 用于檢測陣列所有元素是否都符合指定條件(通過函式提供)
- 如果陣列中檢測到有一個元素不滿足,則整個運算式回傳 false ,且剩余的元素不會再進行檢測,
- 如果所有元素都滿足條件,則回傳 true,
注意:
- 不會對空陣列進行檢測
- 不會改變原始陣列
格式(注意該格式不完整,之針對本題的格式)
array.every(function(currentValue))
function(currentValue)(函式):必須,
- 陣列中的每個元素都會執行這個函式
currentValue:必須,當前元素的值
回傳值:布林值
true:所有元素都通過檢測false:陣列中檢測到有一個元素不滿足
了解更多
set().size方法
- 回傳
Set物件中元素的個數, size的值是一個整數,表示Set物件有多少條目,size的集合訪問函式是undefined- 不能改變這個屬性
相等運算子
相等和不等
| 相等 | 不等 |
|---|---|
== |
!= |
相等回傳true |
不等回傳true |
-
都會先轉換運算元(強制轉換),再比較相等性
-
轉換不同資料型別時,遵循基本規則
-
布林值比較,false為0,true為1
運算式 值 false == 0 true true == 1 true true == 2 false -
字串比較,先將字串轉換成數值(ASCII碼數值)
運算式 值 "5" == 5 true -
物件比較,要呼叫物件的
valueOf()方法,得到基本型別值再比較
-
-
比較時,遵循的規則
-
null和undefined是相等的運算式 值 null == undefined true -
比較相等性之前,不能將
null和undefined轉換成其他任何值運算式 值 undefined == 0 false null == 0 false -
有一個運算元是
NaN,相等回傳false,不相等回傳true(注意:即使兩個運算元都是NaN,NaN不等于NaN,回傳false)運算式 值 "NaN" == NaN false 5 == NaN false NaN == NaN false NaN != NaN false -
兩個運算元都是物件,如果兩個運算元都指向同一個物件,則相等回傳
true,相反回傳false
-
全等和不全等
| 全等 | 不全等 |
|---|---|
=== |
!== |
全等和不全等與相等和不等的區別:
===和!== |
==和!= |
|
|---|---|---|
| 比較前運算元是否需要轉換 | 不需要 | 需要 |
示例
var result1 ={"55" == 55 }; //true
var result2 ={"55" === 55 }; //false
var result3 ={"55" != 55 }; //false
var result4 ={"55" !== 55 }; //true
var result5 ={null == undefined }; //true
var result6 ={null === undefined }; //false
為了保持代碼中資料型別的完整性,推薦使用全等和不全等運算子
Merge an arbitrary number of arrays
需求:
Write a function that takes arguments an arbitrary number of arrays
It should return an array containing the values of all arrays
我的提交
function myFunction(...arrays) {
return [].concat(...arrays);
}
作者答案
function myFunction( ...arrays ) {
return arrays.flat()
}
涉及知識(concat()方法、flat()方法、擴展運算子、拼接陣列的思路)
concat()方法
- 用于連接兩個或多個陣列,
- 不會更改現有陣列,而是回傳一個新陣列,其中包含已連接數組的值,
格式
array1.concat(array2, array3, ..., arrayX)
array2, array3, ..., arrayX:必需,要連接的陣列,
回傳值:已連接的陣列
flat()方法
- 按照一個可指定的深度遞回遍歷陣列,并將所有元素與遍歷到的子陣列中的元素合并為一個新陣列回傳,
格式
var newArray = arr.flat([depth])
depth:指定要提取嵌套陣列的結構深度,默認值為 1
回傳值:一個包含將陣列與子陣列中所有元素的新陣列
擴展運算子
- ES6
- 又稱物件展開符,用
...表示 - 主要用于函式呼叫
了解更多
拼接陣列思路(拓展)
思路一:concat方法
具體操作結合我的提交與涉及知識
思路二:flat()方法
具體操作結合作者答案與涉及知識
思路三:apply(推薦)
arr1.push.apply(arr1,arr2);
思路四:es6的寫法(推薦)
arr1.push(...arrays);
Sort array by object property
需求:
Write a function that takes an array of objects as argument
Sort the array by property b in ascending order
Return the sorted array
我的提交
function myFunction(arr) {
return arr.sort((a,b)=>a.b-b.b);
}
作者答案
function myFunction(arr) {
const sort = (x, y) => x.b - y.b;
return arr.sort(sort);
}
涉及知識(const、sort()方法、箭頭函式)
const
- 塊級范圍的常量,非常類似用
let陳述句定義的變數 - 但常量的值是無法(通過重新賦值)改變的,也不能被重新宣告,
格式
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN:常量名稱,可以是任意合法的識別符號,
valueN:常量值,可以是任意合法的運算式,
了解更多
sort()方法
點擊此處跳轉
箭頭函式
點擊此處跳轉
Merge two arrays with duplicate values
需求:
Write a function that takes two arrays as arguments
Merge both arrays and remove duplicate values
Sort the merge result in ascending order
Return the resulting array
Write a function that takes two arrays as arguments // Merge both arrays and remove duplicate values // Sort the merge result in ascending order // Return the resulting array
這道題我試了很多方法,都是說有一個或多個測驗案例不過,請小伙伴們在留言區分享這道題的解法,謝謝啦!!!!
Sum up all array elements with values greater than
需求:
Write a function that takes an array (a) and a number (b) as arguments
Sum up all array elements with a value greater than b
Return the sum
我的提交
function myFunction(a, b) {
var sum=0;
for(var i=0;ib){
sum+=a[i];
}
}
return sum;
}
作者答案
function myFunction(a, b) {
return a.reduce((sum, cur) => {
if (cur > b) return sum + cur;
return sum;
}, 0);
}
涉及知識(reduce()方法,箭頭函式)
Array.prototype.reduce()
點擊此處跳轉
箭頭函式
點擊此處跳轉
Create a range of numbers
需求:
Write a function that takes two numbers (min and max) as arguments
Return an array of numbers in the range min to max
我的提交
function myFunction(min, max) {
var arr = [];
var length=max-min;
var t=min;
for(var i=0;i<=length;i++){
arr[i]=t;
t++;
}
return arr;
}
作者答案
function myFunction(min, max) {
let arr = [];
for (let i = min; i <= max; i++) {
arr.push(i);
}
return arr;
}
涉及知識(let、push()方法)
let
- let 宣告的變數只在 let 命令所在的代碼塊內有效
- ES6
了解更多
push()方法
- 可向陣列的末尾添加一個或多個元素,并回傳新的長度,
注意:
- 新元素將添加在陣列的末尾
- 此方法改變陣列的長度
- 在陣列起始位置添加元素請使用
unshift()方法,
格式
array.push(item1, item2, ..., itemX)
item1, item2, ..., itemX:必需,要添加到陣列的元素,
回傳值:陣列
Group array of strings by first letter
需求
Write a function that takes an array of strings as argument
Group those strings by their first letter
Return an object that contains properties with keys representing first letters
The values should be arrays of strings containing only the corresponding strings
For example, the array ['Alf', 'Alice', 'Ben'] should be transformed to
{ a: ['Alf', 'Alice'], b: ['Ben']}
我的提交
function myFunction(arr){
let resultObj = {};
for (let i =0; i < arr.length; i++) {
let currentWord = arr[i];
let firstChar = currentWord[0].toLowerCase();
let innerArr = [];
if (resultObj[firstChar] === undefined) {
innerArr.push(currentWord);
resultObj[firstChar] = innerArr
}else {
resultObj[firstChar].push(currentWord)
}
}
return resultObj;
}
作者答案
function myFunction(arr) {
return arr.reduce((acc, cur) => {
const firstLetter = cur.toLowerCase().charAt(0);
return { ...acc, [firstLetter]: [...(acc[firstLetter] || []), cur] };
}, {});
}
涉及知識(toLowerCase()方法、相等運算子、push()方法、reduce()方法、charAt()方法、擴展運算子)
toLowerCase()
- 把字串轉換為小寫,
格式
stringObject.toLowerCase()
回傳值:新的字串,所有大寫字符全部被轉換為了小寫字符
相等運算子
點擊此處跳轉
push()方法
點擊此處跳轉
reduce()方法
點擊此處跳轉
charAt()方法
- 回傳指定位置的字符,回傳字符長度為1,
格式
stringObject.charAt(index)
stringObject:字串物件
index(字符所在的字串中的下標):必需
- 注意:字串中第一個字符的下標是 0,如果引數
index不在 0 與 string.length 之間,該方法將回傳一個空字串
擴展運算子
點擊此處跳轉
Define an array with conditional elements
需求:
Write a function that takes an array with arbitrary elements and a number as arguments
Return a new array, the first element should be either the given number itself
or zero if the number is smaller than 6
The other elements should be the elements of the original array
Try not to mutate the original array
我的提交
function myFunction(arr, num) {
return num>=6? [num].concat(arr):[0].concat(arr);
}
作者答案
function myFunction(arr, num) {
return [...(num > 5 ? [num] : [0]), ...arr];
}
涉及知識(不改變原陣列的方法、擴展運算子、三目運算子)
不改變原陣列的方法
| 不改變原陣列的方法 | 描述 |
|---|---|
| concat | 回傳拼接后的陣列,不改變原陣列; |
| forEach | 遍歷陣列 |
| map | |
| join() | 回傳拼接后的字串,可以指定間隔; |
| slice(start,end); | 截取陣列,回傳截取的部分,不改變原始陣列; |
| sort(); | 排序 |
| toString(); | [1,2,3].toString()==[1,2,3].join(); |
擴展運算子
點擊此處跳轉
三目運算子
點擊此處跳轉
Get every nth element of array
需求:
Write a function that takes an array (a) and a value (n) as arguments
Save every nth element in a new array
Return the new array
我的提交
function myFunction(a, n){
var arr=[];
for(var i=0;i<a.length;i++){
if((i+1)%n==0){
arr.push(a[i]);
}
}
return arr;
}
作者答案
function myFunction(a, n) {
let rest = [...a];
let result = [];
for (let i = 0; i < a.length; i++) {
if (rest.length < n) break;
result.push(rest[n - 1]);
rest = rest.slice(n);
}
return result;
}
涉及知識(擴展運算子、push()方法、slice()方法)
擴展運算子
點擊此處跳轉
push()方法
點擊此處跳轉
slice()方法
點擊此處跳轉
結語
【創作背景】
? 偶然在抖音上刷到JSchallenger這個可以訓練Javascript基礎的網站,自己在完成所有的Schallenger題之后,想要通過博客來記錄自己的做題痕跡,以便日后快速回顧,原本打算把JSchallenger的所有題目以及分析整理成一篇博客發出來,但是我整理完后發現,已經快有1w多字,為了方便讀者和自己觀看,因此打算按照JSchallenger的板塊分開發布,
【感謝】
感謝各位讀者能看到最后!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466032.html
標籤:JavaScript
上一篇:Web前端基礎精品入門(HTML+CSS+JavaScript+JS)[愛前端]聽課筆記:導航條的制作——css學習仿作馬蜂窩
