Heim >Web-Frontend >js-Tutorial >Native JavaScript-Array-Funktionen erklärt
In JavaScript können Sie ein Native JavaScript-Array-Funktionen erklärt mit dem Konstruktor Native JavaScript-Array-Funktionen erklärt
oder mit dem Native JavaScript-Array-Funktionen erklärt-Literal []
erstellen. Letzteres ist die bevorzugte Methode. Das Native JavaScript-Array-Funktionen erklärt
-Objekt erbt von Object.prototype
und die Ausführung des typeof
-Operators auf einem Native JavaScript-Array-Funktionen erklärt gibt object
anstelle von array
zurück. [] instanceof Native JavaScript-Array-Funktionen erklärt
gibt jedoch auch true
zurück. Mit anderen Worten, die Implementierung von Native JavaScript-Array-Funktionen erklärt-ähnlichen Objekten ist komplexer, z. B. strings
-Objekte, arguments
-Objekte, arguments
-Objekte sind keine Instanzen von Native JavaScript-Array-Funktionen erklärt
, sondern haben length
-Attribute und können Werte abrufen durch Indizes, sodass sie wie ein Native JavaScript-Array-Funktionen erklärt in einer Schleife ausgeführt werden können.
In diesem Artikel werde ich einige der Native JavaScript-Array-Funktionen erklärt-Prototyp-Methoden überprüfen und ihre Verwendung untersuchen.
Schleife: .forEach
Urteil: .some
und .every
Unterscheiden Sie zwischen .join
und .concat
Stack- und Queue-Implementierungen: .pop
, .push
, .shift
und .unshift
Modellzuordnung: .map
Abfrage: .filter
Sortierung: .sort
Berechnen: .reduce
und .reduceRight
Kopieren: .slice
Leistungsstark.splice
Suchen: .indexOf
Operator: in
Anflug.reverse
.forEach
Dies ist die einfachste Methode in JavaScript, aber IE7 und IE8 unterstützen diese Methode nicht. .forEach
hat eine Rückruffunktion als Parameter. Beim Durchlaufen des Native JavaScript-Array-Funktionen erklärts wird diese für jedes Native JavaScript-Array-Funktionen erklärt-Element aufgerufen. Die Rückruffunktion akzeptiert drei Parameter:
value
: aktuelles Element
index
: der Index des aktuellen Elements
array
: das zu durchlaufende Native JavaScript-Array-Funktionen erklärt
Zusätzlich optional Der zweite Parameter wird als Kontext jedes Funktionsaufrufs verwendet (this
['_', 't', 'a', 'n', 'i', 'f', ']'].forEach(function (value, index, array) { this.push(String.fromCharCode(value.charCodeAt() + index + 2)) }, out = [])out.join('')// <- 'awesome'123456wird in diesem Beispiel verwendet). Wenn Sie verschiedene Elemente im Native JavaScript-Array-Funktionen erklärt verwenden, ähnelt der Effekt dem von
. .join
Die out[0] + '' + out[1] + '' + out[2] + '' + out[n]
-Schleife kann nicht unterbrochen werden, und das Auslösen einer Ausnahme ist keine kluge Entscheidung. Glücklicherweise haben wir eine andere Möglichkeit, den Betrieb zu unterbrechen. .forEach
Beurteilung:
.some
.every
Wenn Sie Aufzählungen in .NET verwendet haben, ähneln diese beiden Methoden . .Any(x => x.IsAwesome)
verfügt über ähnliche Parameter wie .All(x => x.IsAwesome)
und erfordert eine Rückruffunktion mit drei Parametern:
, .forEach
und value
sowie einen optionalen zweiten Kontextparameter. MDN beschreibt .some wie folgt: index
array
führt die Rückruffunktion einmal für jedes Element im Native JavaScript-Array-Funktionen erklärt aus, bis die RückruffunktionBeachten Sie, dass die Funktionsschleife unterbrochen wird, wenn daszurückgibt. Wenn das Zielelement gefunden wird, gibt
some
soforttrue
zurück, andernfalls gibt some den Wert false zurück. Die Callback-Funktion wird nur für Native JavaScript-Array-Funktionen erklärt-Indizes mit zugewiesenen Werten ausgeführt; sie wird nicht für gelöschte oder nicht zugewiesene Elemente aufgerufen.some
true
max = -Infinity satisfied = [10, 12, 10, 8, 5, 23].some(function (value, index, array) { if (value > max) max = value return value < 10}) console.log(max)// <- 12satisfied// <- true1234567891011der Callback-Funktion aufgerufen wird. Das Funktionsprinzip von
ähnelt dem von value , die Callback-Funktion gibt jedoch false statt true zurück. <code>.every
.some
Unterscheiden zwischen
.join
.concat
werden oft verwechselt. .join
Verkettet Native JavaScript-Array-Funktionen erklärt-Elemente mit .concat
als Trennzeichen und gibt die Zeichenfolgenform zurück. Wenn .join(separator)
nicht angegeben ist, wird der Standardwert separator
verwendet. separator
erstellt ein neues Native JavaScript-Array-Funktionen erklärt als flache Kopie des Quellarrays. ,
.concat
.concat
array.concat(val, val2, val3, valn)
.concat
Flache Kopie bedeutet, dass das neue Native JavaScript-Array-Funktionen erklärt und das ursprüngliche Native JavaScript-Array-Funktionen erklärt dieselben Objektreferenzen behalten, was normalerweise eine gute Sache ist. Zum Beispiel: array.concat()
var a = { foo: 'bar' } var b = [1, 2, 3, a] var c = b.concat() console.log(b === c)// <- falseb[3] === a && c[3] === a// <- true123456789
.pop
, .push
, .shift
和 .unshift
每个人都知道.push
可以再数组末尾添加元素,但是你知道可以使用[].push('a', 'b', 'c', 'd', 'z')
一次性添加多个元素吗? .pop
方法是.push
的反操作,它返回被删除的数组末尾元素。如果数组为空,将返回void 0 (undefined)
,使用.pop
和.push
可以创建LIFO (last in first out)
栈。
function Stack () { this._stack = [] } Stack.prototype.next = function () { return this._stack.pop() } Stack.prototype.add = function () { return this._stack.push.apply(this._stack, arguments) } stack = new Stack() stack.add(1,2,3) stack.next()// <- 31234567891011121314151617
相反,可以使用.shift
和 .unshift
创建FIFO (first in first out)
队列。
function Queue () { this._queue = [] } Queue.prototype.next = function () { return this._queue.shift() } Queue.prototype.add = function () { return this._queue.unshift.apply(this._queue, arguments) } queue = new Queue() queue.add(1,2,3) queue.next()// <- 1Using .shift (or .pop) is an easy way to loop through a set of array elements, while draining the array in the process. list = [1,2,3,4,5,6,7,8,9,10]while (item = list.shift()) { console.log(item) } list// <- []123456789101112131415161718192021222324252627
.map
.map
为数组中的每个元素提供了一个回调方法,并返回有调用结果构成的新数组。回调函数只对已经指定值的数组索引执行;它不会对已删除的或未指定值的元素调用。
Native JavaScript-Array-Funktionen erklärt.prototype.map
和上面提到的.forEach
、.some
和 .every
有相同的参数格式:.map(fn(value, index, array), thisArgument)
values = [void 0, null, false, ''] values[7] = void 0result = values.map(function(value, index, array){ console.log(value) return value })// <- [undefined, null, false, '', undefined × 3, undefined]12345678
undefined × 3
很好地解释了.map
不会对已删除的或未指定值的元素调用,但仍然会被包含在结果数组中。.map
在创建或改变数组时非常有用,看下面的示例:
// casting[1, '2', '30', '9'].map(function (value) { return parseInt(value, 10) })// 1, 2, 30, 9[97, 119, 101, 115, 111, 109, 101].map(String.fromCharCode).join('')// <- 'awesome'// a commonly used pattern is mapping to new objectsitems.map(function (item) { return { id: item.id, name: computeName(item) } })12345678910111213141516
.filter
filter
对每个数组元素执行一次回调函数,并返回一个由回调函数返回true
的元素组成的新数组。回调函数只会对已经指定值的数组项调用。
通常用法:.filter(fn(value, index, array), thisArgument)
,跟C#中的LINQ表达式和SQL中的where
语句类似,.filter
只返回在回调函数中返回true
值的元素。
[void 0, null, false, '', 1].filter(function (value) { return value })// <- [1][void 0, null, false, '', 1].filter(function (value) { return !value })// <- [void 0, null, false, '']123456789
.sort(compareFunction)
如果没有提供
compareFunction
,元素会被转换成字符串并按照字典排序。例如,”80”排在”9”之前,而不是在其后。
跟大多数排序函数类似,Native JavaScript-Array-Funktionen erklärt.prototype.sort(fn(a,b))
需要一个包含两个测试参数的回调函数,其返回值如下:
a在b之前则返回值小于0
a和b相等则返回值是0
a在b之后则返回值小于0
[9,80,3,10,5,6].sort()// <- [10, 3, 5, 6, 80, 9][9,80,3,10,5,6].sort(function (a, b) { return a - b })// <- [3, 5, 6, 9, 10, 80]1234567
.reduce
和.reduceRight
这两个函数比较难理解,.reduce
会从左往右遍历数组,而.reduceRight
则从右往左遍历数组,二者典型用法:.reduce(callback(previousValue,currentValue, index, array), initialValue)
。 previousValue
是最后一次调用回调函数的返回值,initialValue
则是其初始值,currentValue
是当前元素值,index
是当前元素索引,array
是调用.reduce
的数组。
一个典型的用例,使用.reduce
的求和函数。
Native JavaScript-Array-Funktionen erklärt.prototype.sum = function () { return this.reduce(function (partial, value) { return partial + value }, 0) }; [3,4,5,6,10].sum()// <- 2812345678
如果想把数组拼接成一个字符串,可以用.join
实现。然而,若数组值是对象,.join
就不会按照我们的期望返回值了,除非对象有合理的valueOf
或toString
方法,在这种情况下,可以用.reduce
实现:
function concat (input) { return input.reduce(function (partial, value) { if (partial) { partial += ', ' } return partial + value }, '') } concat([ { name: 'George' }, { name: 'Sam' }, { name: 'Pear' } ])// <- 'George, Sam, Pear'123456789101112131415
.slice
和.concat
类似,调用没有参数的.slice()
方法会返回源数组的一个浅拷贝。.slice
有两个参数:一个是开始位置和一个结束位置。 Native JavaScript-Array-Funktionen erklärt.prototype.slice
能被用来将类数组对象转换为真正的数组。
Native JavaScript-Array-Funktionen erklärt.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 }) // <- ['a', 'b']12
这对.concat
不适用,因为它会用数组包裹类数组对象。
Native JavaScript-Array-Funktionen erklärt.prototype.concat.call({ 0: 'a', 1: 'b', length: 2 }) // <- [{ 0: 'a', 1: 'b', length: 2 }]12
此外,.slice
的另一个通常用法是从一个参数列表中删除一些元素,这可以将类数组对象转换为真正的数组。
function format (text, bold) { if (bold) { text = '<b>' + text + '</b>' } var values = Native JavaScript-Array-Funktionen erklärt.prototype.slice.call(arguments, 2) values.forEach(function (value) { text = text.replace('%s', value) }) return text}format('some%sthing%s %s', true, 'some', 'other', 'things')// <- <b>somesomethingother things</b>123456789101112131415
.splice
.splice
是我最喜欢的原生数组函数,只需要调用一次,就允许你删除元素、插入新的元素,并能同时进行删除、插入操作。需要注意的是,不同于`.concat
和.slice
,这个函数会改变源数组。
var source = [1,2,3,8,8,8,8,8,9,10,11,12,13] var spliced = source.splice(3, 4, 4, 5, 6, 7) console.log(source)// <- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13]spliced// <- [8, 8, 8, 8]12345678
正如你看到的,.splice
会返回删除的元素。如果你想遍历已经删除的数组时,这会非常方便。
var source = [1,2,3,8,8,8,8,8,9,10,11,12,13]var spliced = source.splice(9) spliced.forEach(function (value) { console.log('removed', value) })// <- removed 10// <- removed 11// <- removed 12// <- removed 13console.log(source)// <- [1, 2, 3, 8, 8, 8, 8, 8, 9]12345678910111213
.indexOf
利用.indexOf
可以在数组中查找一个元素的位置,没有匹配元素则返回-1
。我经常使用.indexOf
的情况是当我有比较时,例如:a === 'a' || a === 'b' || a === 'c'
,或者只有两个比较,此时,可以使用.indexOf
:['a', 'b', 'c'].indexOf(a) !== -1
。
注意,如果提供的引用相同,.indexOf
也能查找对象。第二个可选参数用于指定开始查找的位置。
var a = { foo: 'bar' } var b = [a, 2] console.log(b.indexOf(1))// <- -1console.log(b.indexOf({ foo: 'bar' }))// <- -1console.log(b.indexOf(a))// <- 0console.log(b.indexOf(a, 1))// <- -1b.indexOf(2, 1)// <- 11234567891011121314151617
如果你想从后向前搜索,可以使用.lastIndexOf
。
in
在面试中新手容易犯的错误是混淆.indexOf
和in
操作符:
var a = [1, 2, 5]1 in a// <- true, but because of the 2!5 in a// <- false1234567
问题是in
操作符是检索对象的键而非值。当然,这在性能上比.indexOf快得多。
var a = [3, 7, 6]1 in a === !!a[1]// <- true1234
.reverse
该方法将数组中的元素倒置。
var a = [1, 1, 7, 8]a.reverse()// [8, 7, 1, 1]1234
.reverse
会修改数组本身。
译文出处:http://www.ido321.com/1568.html
本文根据@Nicolas Bevacqua的《Fun with JavaScript Native Native JavaScript-Array-Funktionen erklärt Functions》所译,整个译文带有我自己的理解与思想,如果译得不好或有不对之处还请同行朋友指点。如需转载此译文,需注明英文出处:http://modernweb.com/2013/11/25/fun-with-javascript-native-array-functions/。
Das obige ist der detaillierte Inhalt vonNative JavaScript-Array-Funktionen erklärt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!