Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Аналог ВПР(excel) в JS (https://javascript.ru/forum/misc/79591-analog-vpr-excel-v-js.html)

nikofedorov 25.02.2020 22:25

Аналог ВПР(excel) в JS
 
Добрый вечер!

Не могу в интернете найти аналог функции ВПР в Excel, необходимо вернуть значение после поиска внутри массива. Прошу помочь с кодом, как это возможно реализовать:

Что ищем:
x = "Бразилия"


Массив, где ищем(синтаксис можно менять):
Аргентина;/argentina.png
Бразилия;/brasil.png
Германия;/germany.jpg


Должно вернуться
/brasil.png

laimas 25.02.2020 22:33

В JS это может быть и объект:

var country = {
    "Аргентина": "/argentina.png",
    "Бразилия": "/brasil.png",
    "Германия": "/germany.jpg"
}


тогда country[x] вернет /brasil.png. Если передать в JS как показано, то можно искать и рег. выражением. Так что сначала определите что ему будет передано, а затем можно определиться с поиском.

рони 25.02.2020 22:38

nikofedorov,
:-?
const obj = {
"Аргентина" : "argentina.png",
"Бразилия" : "brasil.png",
"Германия" : "germany.jpg"};
let x = "Бразилия";
let y = obj[x];
alert(y);

voraa 26.02.2020 08:12

Это смотря как интерпретировать таблицы exel в Javascript
В exel лист имеет строки от 1 до n и столбцы от A до ...
Однако, дпускается и числовое обозначение столбцов от 1 до n
В этом случае в javascript таблицу можно представить так двумерный массив
const list =[

[value11, value12, value13,....],
[value21, value22, value23,....],
.......
[valuen1, valuen2, valuen3,....],
];

Но сама таблица на листе задается хитро - это прямогольник
от строки nrb до строки nre и от столбца ncb и до столбца nce

Функция ВПР (VLOOKUP) имеет вид
ВПР (знач, табл, столб, интерв)
знач - то значение, которое ищем в первом столбце таблицы
столб - номер столбца из которого мы должны взять значение
параметр интерв - если true, может быть найдено не точное, а ближайшее значение, а если false, то ищется точное значение
function VLOOKUP (value, [list, trb, tcb, tre, tce], colmn, interv = true) {
// Параметр tabl задается как массив
// list - лист exel
// trb - начальная строка таблицы в листе
// tcb - начальная колонка таблицы в листе
// tre - конечная строка таблицы в листе
// tce - конечная колонк таблицы в листе
  trb--; tcb--; tre--; tce--; colmn --;
  if (typeof value != 'number') interv = false;
  let findr;
  if (interv) {
	let delt = Infinity;
	findr = -1;
	for (let i = trb; i<= tre; i++) {
		if (Math.abs(value - list[i][tcb]) < delt) {
			delt = Math.abs(value - list[i][tcb]);
			findr = i;
		}
	}
  } else {
	findr = -1
	for (let i = trb; i<= tre; i++) {
	   if (value == list[i][tcb]) {
		  findr = i;
		  break;
		}
	}
  }
  return findr == -1 ?  undefined : list[findr][tcb+colmn];
}

const list1 = [
[0,0,0,0,0],
[0,'Аргентина','argentina.png', 0,0],
[0,'Бразилия','brasil.png', 0,0],
[0,'Германия','germany.jpg', 0,0],
[0,0,0,0,0]
]

const img = VLOOKUP('Бразилия', [list1, 2,2,4,3], 2, false)
alert (img)


Часовой пояс GMT +3, время: 20:48.