本文是我在freecodecamp的学习过程中总结的一些内容,主要涉及JavaScript算法
1.范围内的数字求和
我们会传入一个由两个数字组成的数组。 给出一个含有两个数字的数组,我们需要写一个函数,让它返回这两个数字间所有数字(包含这两个数字)的总和。 最低的数字并不总是第一位。
例如,sumAll([4,1])
应返回 10
,因为从 1 到 4(包含 1、4)的所有数字的和是 10
。
思路:利用Math对象的函数从参数中找出大的数字和小的数字,通过for循环计算出两个数字间所有数字(包含这两个数字)的总和
function sumAll(arr) {
let max = Math.max(...arr)
let min = Math.min(...arr)
var sum=0;
for(var i = min;i<=max;i++){
sum +=i;
}
return sum;
;
}
sumAll([1, 4]);
2.数组的对称差
比较两个数组并返回一个新数组,包含所有只在其中一个数组中出现的元素,排除两个数组都存在的元素。 换言之,我们需要返回两个数组的对称差。
**注意:**返回数组中的元素顺序不会影响挑战的测试结果。
方法一:
思路:新建临时数组temp,内容由数组arr1的元素和数组arr2的元素拼接而成,利用for循环找出两个数组独有的元素push进newArr数组。
function diffArray(arr1, arr2) {
let temp = arr1.concat(arr2)
const newArr = [];
for(let i =0;i<temp.length;i++){
if(arr1.indexOf(temp[i])<0||arr2.indexOf(temp[i])<0){
newArr.push(temp[i])
}
}
return newArr;
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
方法二:
思路:先取公共部分,再用filter方法去做过滤
function diffArray(arr1, arr2) {
var newArr = [],arr3=[];
newArr = arr1.filter(function(value){
return arr2.indexOf(value)>=0;
});console.log(newArr);
arr3 = arr1.concat(arr2);
newArr = arr3.filter(function(value){
return newArr.indexOf(value)<0;
});
return newArr;
}
diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);
3.过滤数组元素
你将获得一个初始数组(destroyer
函数中的第一个参数),后跟一个或多个参数。 从初始数组中移除所有与后续参数相等的元素。
注意: 你可以使用 arguments
对象。
思路:首先吧后跟的多个参数放入temp数组,再使用filter方法过滤元素
function destroyer(arr) {
let num = arguments.length
let temp = []
for(let i = 1;i<num;i++){
temp.push(arguments[i])
}
return arr.filter(item => {
return temp.indexOf(item)==-1
});
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3))
4.找出包含特定键值对的对象
创建一个查看对象数组(第一个参数)的函数,并返回具有匹配的名称和值对的所有对象的数组(第二个参数)。 如果要包含在返回的数组中,则源对象的每个名称和值对都必须存在于集合中的对象中。
比如,如果第一个参数是 [{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }]
,第二个参数是 { last: "Capulet" }
。
思路:运用Object.keys()方法获取source中的key数组,再利用forEach方法对collection数组的对象进行筛选,符合条件的对象push到arr数组中
function whatIsInAName(collection, source) {
const arr = [];
// 只修改这一行下面的代码
var sourceKeys = Object.keys(source);
collection.forEach(function(obj) {
for (let i = 0; i < sourceKeys.length; i++) {
if (!obj.hasOwnProperty(sourceKeys[i])) {
return false;
}
else {
if (source[sourceKeys[i]] !== obj[sourceKeys[i]]) {
return false;
}
}
}
arr.push(obj);
})
// 只修改这一行上面的代码
return arr;
}
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "