Как найти позицию значения в массиве

Есть массив с английским алфавитом:

let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];

Хочу определить, какой у буквы f индекс в массиве. Есть ли функция с необходимым мне функционалом и можно ли это сделать не прогоняя весь массив через цикл?

задан 25 июн 2018 в 18:34

JamesJGoodwin's user avatar

JamesJGoodwinJamesJGoodwin

3,9766 золотых знаков35 серебряных знаков70 бронзовых знаков

Используйте indexOf

alphabet.indexOf('f')

Кстати, indexOf есть и у строк.

// строка abc...
let str_alpha = String.fromCharCode(...[...Array(26).keys()].map(i=>i+97));
console.log(str_alpha.indexOf('f'));
// массив 'a', 'b', 'c'...
let arr_alpha = str_alpha.split('');
console.log(arr_alpaha);

ответ дан 25 июн 2018 в 18:40

функция с … функционалом

зачет по русскому языку сдан.


var alphabetIndices = {
  ...
  f: 5,
  ...
};

var someLetter = 'f';
var index = alphabetIndices[someLetter]; // 5

Такое решение позволяет определять индекс буквы в алфавите, не заботясь о регистре:

var alphabetIndices = {
  ...
  f: 5, F: 5,
  ...
};

или использовать его для получения натурального номера буквы:

var alphabetOrdinals = {
  ...
  f: 6, F: 6,
  ...
};

ответ дан 25 июн 2018 в 18:36

12

еще вариант через indexOf():

let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];

let res = alphabet.indexOf('v');
console.log(res)

ответ дан 25 июн 2018 в 18:44

Сергей Петрашко's user avatar

let alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];

console.log(alphabet.findIndex(item => item === 'e'));
console.log(alphabet.findIndex(item => item === 'x'));
console.log(alphabet.findIndex(item => item === 'a'));
console.log(alphabet.findIndex(item => item === 'd'));

ответ дан 25 июн 2018 в 18:50

RifmaMan's user avatar

RifmaManRifmaMan

1,7561 золотой знак7 серебряных знаков19 бронзовых знаков

Если без объявленного цикла, то можно так, но что под капотом во внутренних методах Array: split, join, toString, slice я не знаю, возможно в своих инструкциях и имеют циклы. Также можно создать и в последующем использовать, внутренний объект для записи искомых ключей.

var alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
/*
// v.1	
var someLetter = 'z';
var result = (function(_first, _second){return [--_first.split(",").length, -(_second.split(",").length)]}).apply(null, ("," + alphabet.join() + ",").split("," +someLetter + ","));
	console.log(alphabet[result[0]]);
	console.log(alphabet.slice(result[0]).shift());
	console.log(alphabet.slice(result[1]).shift());
*/

// v.2.0.1
Array.prototype["_indexSide_"] = function(_markerName, _flag){
	return (function(_first, _second){
		return !!_second && !!_flag? // v.2.0.1  если _second при разделении равен undefined то метод вернёт несуществующий индекс 
//		return !!_flag? // v.2
			-(_second.split(",").length) // если _flag true то вернёт отрицательный порядковый индекс маркера с конца массива 
			:
			--_first.split(",").length; // если _flag не передан или false, метод возвращает порядковый индекс маркера от начала массива
	}).apply(null, (","		
		+ this.toString() // v.2.0.1
//		+ this.join() // v.2
		+ ",").split("," +_markerName + ","))
}
	console.log(alphabet[alphabet._indexSide_("f")]);
	console.log(alphabet.slice(alphabet._indexSide_("a")).shift());
	console.log(alphabet.slice(alphabet._indexSide_("z", true)).shift());
	console.log(alphabet[alphabet._indexSide_("figvam")]);

ответ дан 25 июн 2018 в 20:36

L11VADIS's user avatar

L11VADISL11VADIS

6086 серебряных знаков11 бронзовых знаков

Функция ПОИСКПОЗ

Совет: Попробуйте использовать новую функцию XMATCH , улучшенную версию функции MATCH, которая работает в любом направлении и по умолчанию возвращает точные совпадения, что упрощает и удобнее в использовании, чем предшественницу.

Функция ПОИСКПОЗ выполняет поиск указанного элемента в диапазоне ячеек и возвращает относительную позицию этого элемента в диапазоне. Например, если диапазон A1:A3 содержит значения 5, 25 и 38, то формула =ПОИСКПОЗ(25;A1:A3;0) возвращает значение 2, поскольку элемент 25 является вторым в диапазоне.

Браузер не поддерживает видео.

Совет: Функцией ПОИСКПОЗ следует пользоваться вместо одной из функций ПРОСМОТР, когда требуется найти позицию элемента в диапазоне, а не сам элемент. Например, функцию ПОИСКПОЗ можно использовать для передачи значения аргумента номер_строки функции ИНДЕКС.

Синтаксис

ПОИСКПОЗ(искомое_значение;просматриваемый_массив;[тип_сопоставления])

Аргументы функции ПОИСКПОЗ описаны ниже.

  • Искомое_значение.    Обязательный аргумент. Значение, которое сопоставляется со значениями в аргументе просматриваемый_массив. Например, при поиске номера в телефонной книге имя абонента указывается в качестве искомого значения, а нужным значением будет номер телефона.

    Аргумент искомое_значение может быть значением (числом, текстом или логическим значением) или ссылкой на ячейку, содержащую такое значение.

  • Просматриваемый_массив    Обязательный аргумент. Диапазон ячеек, в которых производится поиск.

  • Тип_сопоставления.    Необязательный аргумент. Число -1, 0 или 1. Аргумент тип_сопоставления указывает, каким образом в Microsoft Excel искомое_значение сопоставляется со значениями в аргументе просматриваемый_массив. По умолчанию в качестве этого аргумента используется значение 1.

    В приведенной ниже таблице описано, как функция находит значения в зависимости от аргумента тип_сопоставления.

Тип_сопоставления

Поведение

1 или опущен

Функция ПОИСКПОЗ находит наибольшее значение, которое меньше или равно значению аргумента искомое_значение. Просматриваемый_массив должен быть упорядочен по возрастанию: …, -2, -1, 0, 1, 2, …, A-Z, ЛОЖЬ, ИСТИНА.

0

Функция ПОИСКПОЗ находит первое значение, равное аргументу искомое_значение. Просматриваемый_массив может быть не упорядочен.

-1

Функция ПОИСКПОЗ находит наименьшее значение, которое больше или равно значению аргумента искомое_значение. Просматриваемый_массив должен быть упорядочен по убыванию: ИСТИНА, ЛОЖЬ, Z — A, …, 2, 1, 0, -1, -2, … и т. д.

  • Функция ПОИСКПОЗ возвращает не само значение, а его позицию в аргументе просматриваемый_массив. Например, функция ПОИСКПОЗ(«б»;{«а»;»б»;»в«};0) возвращает 2 — относительную позицию буквы «б» в массиве {«а»;»б»;»в»}.

  • Функция ПОИСКПОЗ не различает регистры при сопоставлении текста.

  • Если функция ПОИСКПОЗ не находит соответствующего значения, возвращается значение ошибки #Н/Д.

  • Если тип_сопоставления равен 0 и искомое_значение является текстом, то искомое_значение может содержать подстановочные знаки: звездочку (*) и вопросительный знак (?). Звездочка соответствует любой последовательности знаков, вопросительный знак — любому одиночному знаку. Если нужно найти сам вопросительный знак или звездочку, перед ними следует ввести знак тильды (~).

Пример

Скопируйте образец данных из следующей таблицы и вставьте их в ячейку A1 нового листа Excel. Чтобы отобразить результаты формул, выделите их и нажмите клавишу F2, а затем — клавишу ВВОД. При необходимости измените ширину столбцов, чтобы видеть все данные.

Продукт

Количество

Бананы

25

Апельсины

38

Яблоки

40

Груши

41

Формула

Описание

Результат

=ПОИСКПОЗ(39;B2:B5,1;0)

Так как точного соответствия нет, возвращается позиция ближайшего меньшего элемента (38) в диапазоне B2:B5.

2

=ПОИСКПОЗ(41;B2:B5;0)

Позиция значения 41 в диапазоне B2:B5

4

=ПОИСКПОЗ(40;B2:B5;-1)

Возвращает сообщение об ошибке, так как диапазон B2:B5 упорядочен не по убыванию.

#Н/Д

Нужна дополнительная помощь?

Нужны дополнительные параметры?

Изучите преимущества подписки, просмотрите учебные курсы, узнайте, как защитить свое устройство и т. д.

В сообществах можно задавать вопросы и отвечать на них, отправлять отзывы и консультироваться с экспертами разных профилей.

  • Редакция Кодкампа

17 авг. 2022 г.
читать 1 мин


Вы можете использовать следующие методы, чтобы найти положение индекса определенных значений в массиве NumPy:

Метод 1: найти все ценные позиции в индексе

np.where (x== value )

Метод 2: найти первую позицию индекса значения

np.where (x== value )[0][0]

Метод 3: найти первую позицию индекса нескольких значений

#define values of interest
vals = np.array([ value1 , value2 , value3 ])

#find index location of first occurrence of each value of interest
sorter = np.argsort (x)
sorter[np.searchsorted (x, vals, sorter=sorter)]

В следующих примерах показано, как использовать каждый метод на практике.

Метод 1: найти все ценные позиции в индексе

В следующем коде показано, как найти каждую позицию индекса, которая равна определенному значению в массиве NumPy:

import numpy as np

#define array of values
x = np.array([4, 7, 7, 7, 8, 8, 8])

#find all index positions where x is equal to 8
np.where (x== 8 )

(array([4, 5, 6]),)

Из вывода мы видим, что позиции индекса 4, 5 и 6 равны значению 8 .

Метод 2: найти первую позицию индекса значения

В следующем коде показано, как найти первую позицию индекса, равную определенному значению в массиве NumPy:

import numpy as np

#define array of values
x = np.array([4, 7, 7, 7, 8, 8, 8])

#find first index position where x is equal to 8
np.where (x== 8 )[0][0]

4

Из вывода мы видим, что значение 8 сначала встречается в позиции индекса 4.

Метод 3: найти первую позицию индекса нескольких значений

В следующем коде показано, как найти первую позицию индекса нескольких значений в массиве NumPy:

import numpy as np

#define array of values
x = np.array([4, 7, 7, 7, 8, 8, 8])

#define values of interest
vals = np.array([4, 7, 8])

#find index location of first occurrence of each value of interest
sorter = np.argsort (x)
sorter[np.searchsorted (x, vals, sorter=sorter)]

array([0, 1, 4])

Из вывода мы видим:

  • Значение 4 сначала встречается в индексной позиции 0.
  • Значение 7 сначала встречается в индексной позиции 1.
  • Значение 8 сначала встречается в индексной позиции 4.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные операции в NumPy:

Как сопоставить функцию с массивом NumPy
Как преобразовать массив NumPy в список в Python
Как рассчитать величину вектора с помощью NumPy

Основное назначение этой функции в том, чтобы искать позицию заданного элемента в наборе значений. Чаще всего она применяется для поиска порядкового номера ячейки в диапазоне, где лежит нужное нам значение.

Синтаксис этой функции следующий:

=ПОИСКПОЗ(Что_ищем; Где_ищем; Режим_поиска)

где

  • Что_ищем — это значение, которое надо найти
  • Где_ищем — это одномерный диапазон или массив (строка или столбец), где производится поиск
  • Режим_поиска — как мы ищем: точно (0), с округлением в большую строну (-1) или в меньшую сторону (1)

Давайте рассмотрим несколько полезных вариантов ее применения на практике.

Точный поиск

Классический сценарий — поиск точного текстового совпадения для нахождения позиции нужного нам текста или числа в списке:

ПОИСКПОЗ в Excel

Поиск первой или последней текстовой ячейки

Если в качестве искомого значения задать звездочку, то функция будет искать первую ячейку с текстом и выдавать её позицию. Для поиска последней текстовой ячейки можно изменить третий аргумент Режим_поиска с нуля на минус 1:

Поиск первого или последнего текста

Числа и пустые ячейки в этом случае игнорируются.

Поиск ближайшего числа или даты

Если последний аргумент задать равным 1 или -1, то можно реализовать поиск ближайшего наименьшего или наибольшего числа. Таблица при этом обязательно должна быть отсортирована по возрастанию или убыванию соответственно. В общем и целом, это чем-то похоже на интервальный просмотр у функции ВПР (VLOOKUP), но там возможен только поиск ближайшего наименьшего, а здесь — есть выбор.

Например, нам нужно выбрать генератор из прайс-листа для расчетной мощности в 47 кВт. Если последний аргумент задать равным 1 и отсортировать таблицу по возрастанию, то мы найдем ближайшую наименьшую по мощности модель (Зверь):

ПОИСКПОЗ поиск ближайшего наименьшего числа

Если же третий аргумент равен -1 и таблица отсортирована по убыванию, то мы найдем ближайшую более мощную модель (Бомба):

ПОИСКПОЗ поиск ближайшего наибольшего

Связка функций ПОИСКПОЗ и ИНДЕКС

Очень часто функция ПОИСКПОЗ используется в связке с другой крайне полезной функцией — ИНДЕКС (INDEX), которая умеет извлекать данные из диапазона по номеру строки-столбца, реализуя, фактически, «левый ВПР».

Так, в предыдущем примере получить не номер, а название модели генератора можно очень легко:

ПОИСКПОЗ и ИНДЕКС

Ну, и поскольку Excel внутри хранит и обрабатывает даты как числа, то подобный подход на 100% работает и с датами. Например, мы можем легко определить на каком этапе сейчас находится наш проект:

ПОИСКПОЗ и даты

Принципиальное ограничение функции ПОИСКПОЗ состоит в том, что она умеет искать только в одномерных массивах (т.е. строчке или столбце), но никто не запрещает использовать сразу два ПОИСКПОЗа вложенных в ИНДЕКС, чтобы реализовать двумерный поиск по строке и столбцу одновременно:

Двумерный поиск с ПОИСКПОЗ и ИНДЕКС

Ссылки по теме

  • 5 вариантов применения функции ИНДЕКС (INDEX)
  • Интервальный просмотр с помощью функции ВПР (VLOOKUP)
  • Поиск последнего значения в строке или столбце
  • Как создать авторастягивающийся диапазон с автоподстройкой размеров

For instance, a variable named arrayElements of array type contains [1,2,3,4].

How do i get the position of which that has the value «3» in the array variable besides using loop?

thanks.

asked Jan 14, 2012 at 16:27

Jia-Luo's user avatar

consider using indexOf, it returns the 0-based position of the element in the array.

e.g.

[1,2,3,4].indexOf(3); // produces 2

Note that this method is not available in IE 8 and below.

answered Jan 14, 2012 at 16:28

qiao's user avatar

qiaoqiao

17.8k6 gold badges57 silver badges46 bronze badges

2

jQuery provides yout with an «inArray» functionality, similar to PHP:

var a = [1,2,3,4];
console.log( jQuery.inArray(3, a) ); //returns 2

If you’re already using jQuery in your project, this would be the way to go!
jQuery uses indexOf (the fastest solution) if possible and steps back to a loop based solution if not.

answered Jan 14, 2012 at 16:43

zaphod1984's user avatar

zaphod1984zaphod1984

8362 gold badges7 silver badges21 bronze badges

Or simple use a for loop:

function getPosition(elementToFind, arrayElements) {
    var i;
    for (i = 0; i < arrayElements.length; i += 1) {
        if (arrayElements[i] === elementToFind) {
            return i;
        }
    }
    return null; //not found
}

getPosition(3, [1, 2, 3, 4]);

answered Jan 14, 2012 at 16:36

Sebastian Stiehl's user avatar

Sebastian StiehlSebastian Stiehl

1,8801 gold badge14 silver badges22 bronze badges

As was already pointed out by some answers, arrays in newer browsers have methods like indexOf map and forEach that are very convenient for avoiding writing lots of for-loops.

If you need to support old environments without these functions I would strongly recommend using a library (or writing one of your own) to implement those very common array operations (kind of how soc suggested).

var arrayfn = (function(){
    var M = {};

    M.indexOf = function(array, item){ ... };

    M.contains = function(array, item){ return M.indefOf(array, item) !== -1; };

    M.map = function(array, callback){ ... };
}());

arrayfn.contains([1,2,3], 2);

Most popular JS frameworks should already have most of these builtin anyway. Out of the top of my head I remember Dojo, jQuery and Underscore have some of these functions, for example.

answered Jan 14, 2012 at 17:14

hugomg's user avatar

hugomghugomg

67.9k24 gold badges160 silver badges246 bronze badges

This example only demonstrate that is possible the use of map() to return each element of the array. Once we have it, we retrieve the element’s index in the array:

function searchPosition(elementToFind, array) {
    return array.map(function(el) {
        return el;
    }).indexOf(elementToFind);
}

searchPosition(3, [1, 2, 3, 4]); // returns 2

BONUS:

This is not a part of the OP’s question, but if you want to retrieve the position of the first element in the array that satisfies certain condition, you can do it with the findIndex() function provided in the ES6:

var array = [101, 90, 104, 80];

function findFirstLessNumber(element) {
  return element < 100;
}

console.log(array.findIndex(findFirstLessNumber)); // returns 1 (the position of 90)

answered Apr 2, 2018 at 17:50

robe007's user avatar

robe007robe007

3,3834 gold badges33 silver badges59 bronze badges

1

Понравилась статья? Поделить с друзьями:
  • Как найти определенную фразу на сайте
  • Как найти кнопку валет в машине томагавк
  • Как найти асимметрию непрерывной случайной величины
  • Как найти партнера в регионе
  • Как найти угол 150 градусов в радианах