aboutsummaryrefslogtreecommitdiff
path: root/files/uk/web/javascript/reference/global_objects/array/indexof/index.html
blob: 049c3ab86996545b1d5e908395400bd3f8a1f243 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
---
title: Array.prototype.indexOf()
slug: Web/JavaScript/Reference/Global_Objects/Array/indexOf
tags:
  - Array
  - JavaScript
  - Масив
  - метод
translation_of: Web/JavaScript/Reference/Global_Objects/Array/indexOf
---
<div>{{JSRef}}</div>

<p>Метод <code><strong>indexOf()</strong></code> повертає перший індекс, за яким даний елемент був знайдений в масиві, а якщо він відсутній, то повертає -1.</p>

<div class="note">
<p><strong>Примітка:</strong> Щодо метода String, дивіться {{jsxref("String.prototype.indexOf()")}}.</p>
</div>

<pre class="brush: js">var a = [2, 9, 9];
a.indexOf(2); // 0
a.indexOf(7); // -1

if (a.indexOf(7) === -1) {
  // елемент не існує у масиві
}
</pre>

<h2 id="Синтаксис">Синтаксис</h2>

<pre class="syntaxbox"><var>arr</var>.indexOf(<var>searchElement[</var>, <var>fromIndex]</var>)</pre>

<h3 id="Параметри">Параметри</h3>

<dl>
 <dt><code>searchElement</code></dt>
 <dd>Елемент, який потрібно знайти.</dd>
 <dt><code>fromIndex</code> {{optional_inline}}</dt>
 <dd>Індекс, з якого починається пошук. Якщо індекс більше або дорівнює довжині масиву, повертається  -1, що означає, що масив не буде шукатися. Якщо значення показника є від'ємним числом, то воно трактується як зміщення від кінця масиву.</dd>
 <dd><code>Примітка:</code> якщо наданий індекс від'ємний, масив все ще ітерується спереду назад. Якщо індекс  рівний 0, то буде проведений пошук по всьому масиву. За замовчуванням: 0 (виконується пошук по всьому масиву).</dd>
</dl>

<h3 id="Значення_яке_повертається">Значення, яке повертається</h3>

<p>Перший індекс елемента в масиві; якщо не знайдено, то <strong>-1</strong>.</p>

<h2 id="Опис">Опис</h2>

<p><code>indexOf()</code> порівнює <code>searchElement</code> з елементами Масиву, використовуючи <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Using_the_Equality_Operators">строгу рівність</a> (той самий метод, що використовується з допомогою <code>===</code> або потрійним дорівнює).</p>

<h2 id="Приклад">Приклад</h2>

<h3 id="Використання_indexOf()">Використання <code>indexOf()</code></h3>

<p>У наступному прикладі <code>indexOf()</code> використовується для пошуку значень в масиві.</p>

<pre class="brush: js">var array = [2, 9, 9];
array.indexOf(2);     // 0
array.indexOf(7);     // -1
array.indexOf(9, 2);  // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0
</pre>

<h3 id="Пошук_всіх_відопвідностей_на_елементі">Пошук всіх відопвідностей на елементі</h3>

<pre class="brush: js">var indices = [];
var array = ['a', 'b', 'a', 'c', 'a', 'd'];
var element = 'a';
var idx = array.indexOf(element);
while (idx != -1) {
  indices.push(idx);
  idx = array.indexOf(element, idx + 1);
}
console.log(indices);
// [0, 2, 4]
</pre>

<h3 id="Пошук_чи_існує_елемент_в_масиві_і_його_оновлення">Пошук, чи існує елемент в масиві, і його оновлення </h3>

<pre class="brush: js">function updateVegetablesCollection (veggies, veggie) {
    if (veggies.indexOf(veggie) === -1) {
        veggies.push(veggie);
        console.log('Оновлений набір овочів : ' + veggies);
    } else if (veggies.indexOf(veggie) &gt; -1) {
        console.log(veggie + ' вже існує у наборі овочів.');
    }
}

var veggies = ['картопля', 'помідор', 'чилі', 'зелений перець'];

updateVegetablesCollection(veggies, 'шпинат');
// Оновлений набір овочів: картопля,помідор,чилі,зелений перець,шпинат
updateVegetablesCollection(veggies, 'шпинат');
// шпинат вже існує у наборі овочів.
</pre>

<h2 id="Поліфіл">Поліфіл</h2>

<p><code>indexOf()</code> був доданий в стандарт ECMA-262 в 5-му виданні; як такий він може бути присутнім не у всіх браузерах. Це можна обійти, використовуючи наступний код на початку скриптів. Це дозволить вам використовувати метод <code>indexOf()</code>, коли ще немає вбудованої підтримки в браузері. Цей алгоритм збігається із зазначеною в ECMA-262, 5-е видання, припускаючи, що{{jsxref("Global_Objects/TypeError", "TypeError")}} і {{jsxref("Math.abs()")}} має свої оригінальні значення.</p>

<pre class="brush: js">if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function indexOf(member, startFrom) {
    /*
   У спрощеному режимі, якщо змінна `this` має значення null або
 undefined, то вона встановлюється в об'єкт window. В іншому випадку
 `this` автоматично перетворюється в об'єкт. У строгому режимі, якщо
 змінна 'this' має значення null або undefined, генерується 'TypeError'.
    */
    if (this == null) {
      throw new TypeError("Array.prototype.indexOf() - can't convert `" + this + "` to object");
    }

    var
      index = isFinite(startFrom) ? Math.floor(startFrom) : 0,
      that = this instanceof Object ? this : new Object(this),
      length = isFinite(that.length) ? Math.floor(that.length) : 0;

    if (index &gt;= length) {
      return -1;
    }

    if (index &lt; 0) {
      index = Math.max(length + index, 0);
    }

    if (member === undefined) {
      /*
        Оскільки `member` не визначено, ключі, які не існують,
        будуть мати те ж значення, що і `member`, і, отже, повинні
        бути перевірені.
      */
      do {
        if (index in that &amp;&amp; that[index] === undefined) {
          return index;
        }
      } while (++index &lt; length);
    } else {
      do {
        if (that[index] === member) {
          return index;
        }
      } while (++index &lt; length);
    }

    return -1;
  };
}</pre>

<p>Однак, якщо ви більше зацікавлені у всіх маленьких технічних бітах, визначених стандартом ECMA, і менше стурбовані продуктивністю або лаконічністю, то ви можете знайти це більш описове заповнення більш корисним.</p>

<pre class="brush: js">// Кроки продукції ECMA-262, Edition 5, 15.4.4.14
// Посилання: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Нехай o є результатом виклику ToObject, що передає це
    //    значення в якості аргументу.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var o = Object(this);

    // 2. Нехай lenValue є результатом виклику Get,
    //    внутрішнього методу o з аргументом "length".
    // 3. Нехай len буде ToUint32(lenValue).
    var len = o.length &gt;&gt;&gt; 0;

    // 4. Якщо len рівне 0, return -1.
    if (len === 0) {
      return -1;
    }

    // Якщо аргумент fromIndex був переданий, let n =
    // ToInteger(fromIndex); інакше let n = 0.
    var n = fromIndex | 0;

    // 6. Якщо n &gt;= len, return -1.
    if (n &gt;= len) {
      return -1;
    }

    // 7. Якщо n &gt;= 0, то нехай k дорівнює n.
    // 8. Інакше, n&lt;0, нехай k дорівнює len - abs(n).
    //    Якщо k менше, ніж 0, тоді нехай k дорівнює 0.
    k = Math.max(n &gt;= 0 ? n : len - Math.abs(n), 0);

    // 9. Повторювати, доки k &lt; len
    while (k &lt; len) {
      // а. Нехай Pk дорівнює ToString(k). Це неочевидно для лівосторонніх операндів оператора in
      // б. Нехай kPresent буде результатом виклику
      //    внутрішнього метода o HasProperty з аргументом Pk.
      //    Цей крок можна поєднати з в
      // в. Якщо kPresent дорівнює true, тоді
      //    i.  Нехай elementK буде результатом виклику
      //        внутрішнього метода o Getwith з аргументом ToString(k).
      //   ii.  Нехай те саме буде результатом застосування
      //        Алгоритму Строгого Порівняння (Strict Equality Comparison Algorithm)
      //        до searchElement та elementK.
      //  iii.  Якщо те саме дорівнює true, повернути k.
      if (k in o &amp;&amp; o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}
</pre>

<h2 id="Специфікації">Специфікації</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Специфікація</th>
   <th scope="col">Статус</th>
   <th scope="col">Коментар</th>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-15.4.4.14', 'Array.prototype.indexOf')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td>Початкове визначення. Реалізовано у JavaScript 1.6.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-array.prototype.indexof', 'Array.prototype.indexOf')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td></td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-array.prototype.indexof', 'Array.prototype.indexOf')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2 id="Сумісність_з_веб-переглядачами">Сумісність з веб-переглядачами</h2>

<div>


<p>{{Compat("javascript.builtins.Array.indexOf")}}</p>
</div>

<h2 id="Примітки_щодо_сумісності">Примітки щодо сумісності</h2>

<ul>
 <li>Починаючи з Firefox 47 {{geckoRelease(47)}},  цей метод більше не повертатиме <code>-0</code>. Наприклад, <code>[0].indexOf(0, -0)</code> тепер завжди повертатиме <code>+0</code> ({{bug(1242043)}}).</li>
</ul>

<h2 id="Див._також">Див. також</h2>

<ul>
 <li>{{jsxref("Array.prototype.lastIndexOf()")}}</li>
 <li>{{jsxref("TypedArray.prototype.indexOf()")}}</li>
 <li>{{jsxref("String.prototype.indexOf()")}}</li>
</ul>