前言 【筆記內容】 關於JSchallenger中Arrays對象題目的復盤 本人的提交、以及做題時的思路 分析作者答案 涉及的知識快速瞭解,註意:並不深入分析具體知識,只是圍繞題目展開 【筆記目的】 幫助本人進一步瞭解Javascript的Arrays對象以及涉及的方法 對自己做題後的復盤,進一步 ...
前言
【筆記內容】
- 關於JSchallenger中Arrays對象題目的復盤
- 本人的提交、以及做題時的思路
- 分析作者答案
- 涉及的知識快速瞭解,註意:並不深入分析具體知識,只是圍繞題目展開
【筆記目的】
- 幫助本人進一步瞭解Javascript的Arrays對象以及涉及的方法
- 對自己做題後的復盤,進一步瞭解自己的不足之處
【相關資源】
【溫馨提示】
- 筆記中有些個人理解後整理的筆記,可能有所偏差,也懇請讀者幫忙指出,謝謝。
- 若是有其他的解題方法也請讀者分享到評論區,一起學習,共同進步,謝謝。
- 我的提交有不足之處也懇請讀者幫忙指出,不吝賜教,謝謝。
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的板塊分開發佈。
【感謝】
感謝各位讀者能看到最後!!!