皆さんとのディスカッションを歓迎します~
基本演習 (1):
私の答えは次のとおりです。
function array_diff(a, b) { if (b == "") return a; return a.filter(function(item,index,array) {var flag = false;for(var i=0;i<b.length;i++) { if(item !== b[i]) flag = true;
}return flag;
});
}
ログイン後にコピー
分析:
配列 a で filter() メソッドを使用し、配列 a の値が配列 b に存在するかどうかを繰り返し判断します。 x の値、つまり配列 a の値が配列 b に見つからない場合、b.indexOf() メソッドは -1 を返します。配列の filter() メソッドは、配列内の各項目に対して指定された関数を実行し、関数が true を返す項目で構成される配列を返すことを指します。
私の考えは少し複雑で、配列を反復するメソッドfilter()を考えましたが、関数内の判定方法が十分に簡潔ではなく、うまく活用できませんでした。 IndexOf() メソッドを使用して判断することは考えられません。
注:
filter() メソッド は、配列内の各項目に対して指定された関数を実行し、関数が true を返す項目の配列を返すことを指します。指定された関数を使用して、返された配列に項目が含まれているかどうかを判断します。
使用例:
var数値 = [1,2,3,4,5,4,3,2,1];
var filterResult =数値.filter(function(item) 、インデックス、配列) {
Return (item>2);
});
alter(filterResult) //[3,4,5,4,3]
配列反復メソッドは非常に一般的に使用され、配列に対する特定の操作をループするために使用されます。これらの反復メソッドは for ループ ステートメントよりもはるかに簡単なので、覚えておいてください。
5 つの反復メソッドがあります:every()、filter()、forEach()、map()、some()。
基本練習(2):
私の答えは:
そうです
より良い答えは:
function array_diff(a, b) { return a.filter(function(x) { return b.indexOf(x) == -1; });
}
ログイン後にコピー
分析:
より良い答えでは、元の配列に対して concat() メソッドが使用され、元の配列をコピーして新しい配列を作成できます。次に、新しい配列がソートされ、中間値のインデックス値が見つかります。
私のアイデアは最適解と同じですが、実装方法がまだ少し未熟です。新しい配列を作成する場合、 concat() メソッドを使用して簡単にコピーできるかどうかはわかりませんが、これは私が基本的な知識を十分に理解していないことを示しています。また、ソート方法では、「return a-b」を直接使用できることがわかりましたが、私の方法は非常に面倒に思えます。
笔记:
concat()方法可基于当前数组中的所有项创建一个新数组。该方法会先创建当前数组的一个副本,将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。在没有给concat()方法传递参数的情况下,它只是复制。若传递给concat()方法的是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中。若传递值不是数组,则添加到结果数组的末尾。
使用例子:
var colors = ["red","green","blue"];
var colors = colors.concat("yellow",["black","brown"]);
alert(colors); // red,green,blue
alert(colors); // red,green,blue,yellow,black,brown
重排序方法:使用sort()方法可以进行排序,但仍可能会出现一些问题,因此使用比较函数,可以避免这个问题。
对于大多数数据类型可使用,只需要将其作为参数传递给sort()方法即可:
function compare(value1,value2) {
if(value1 < value2) {
return -1;
} else if (value1> value2) {
return 1;
} else {
returm 0;
}
}
对于数值型或其他valueOf()方法会返回数值类型的对象类型,可以使用更简单的比较函数:
function compare(value1,value2) {
return value2 - value1;
}
基础练习(3):
我的解答为:function minMax(arr){ var newarr = [];
newarr.push(Math.min.apply(Math,arr));
newarr.push(Math.max.apply(Math,arr)); return newarr;
}
ログイン後にコピー
较优解答为:
function minMax(arr){ return [Math.min(...arr), Math.max(...arr)];
}
ログイン後にコピー
分析:
这道题目就很简单了,较优解答中的扩展语法( spread syntax)也在练习一中提及了。我的写法还是太谨慎了,是不是应该大胆一些呢?
基础练习(4):
我的解答为:function XO(str) { var str = str.toLowerCase(); var countx = 0; var counto = 0; for(var i=0;i<str.length;i++) { if(str[i] === "x") {
countx++;
} if(str[i] === "o") {
counto++;
}
}if(counto == countx) { return true;
} else { return false;
}
}
ログイン後にコピー
较优解答为:
function XO(str) {var a = str.replace(/x/gi, ''),
b = str.replace(/o/gi, '');return a.length === b.length;
}
ログイン後にコピー
分析:
较优解使用的是replace()方法,结合正则表达式的使用,对原字符串str分别将x和o用空字符串替换得到a和b字符串,比较a和b字符串的长度,从而得到结果。我的解答方法呢,因为实在想不到可以使用什么方法,所以用的最原始的方法,仿佛自己在做C语言的题目。
笔记:
replace()方法,该方法接受两个参数,一个参数可以是一个RegExp对象或者一个字符串,第二个参数可以是一个字符串或者是一个函数。若第一个参数是字符串,指挥替换第一个子字符串。要想替换所有子字符串,是提供一个正则表达式,并且指定全局标志。
使用例子:
var text = "cat,bat,sat,fat";
var result = text.replace("at","ond");
alert(result); //"cond,bat,sat,fat"
result = text.replace(/at/g,"ond");
alert(result); //"cond,bond,song,fond"
总结:
今天的知识点主要是数组的迭代方法中的一种filter()方法、数组操作方法中的concat()方法以及字符串的replace()方法。filter()方法可用于使用函数判断数组中各项的值中返回true值的结果所组成的数组。concat()可以复制和创建新数组。而replace()方法可以替换字符串中的一个或多个值。
从这三天的练习来看,对于数组的各种方法也逐渐使用得熟练起来了。但是其他类型的各种方法还是一种挑战。而我的解答也要从比较冗余的语句,写出更为简洁而有效的语句了。继续加油吧!
以上がJavaScript 演習のサンプル チュートリアルを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。