Как обратится к массиву в динамической функции

239
23 апреля 2017, 00:26

Проблема в том что название (не массив!) массива передается в динамическую функцию и нужно из этого массива прочитать значения. Функция примерно такая:

var getFromTable = new Function ('index', 'arr', 'property', 'return arr[index][property]');

Вызов выглядит так:

var c = getFromTable (1, 'materials', 'width');

Ожидаемо, что все это не работает, но как сделать чтоб сработало?

Answer 1

ну например так...

var materials = [ 
  {width: 10}, {width: 20}, {width: 30} 
] 
 
function getFromTable(i, arr, prop) { 
  if (!Array.isArray(arr)) throw "second arg must be arr"; 
  if (!arr[i]) throw "no index in arr"; 
  if (!arr[i][prop]) throw "no prop in index arr";; 
  return arr[i][prop]; 
} 
 
console.log(getFromTable(2, materials, 'width'));

Если же вам необходимо передавать название массива как строку, что меня очень смущает и я не могу представить себе прикладную задачу для решения которой это необходимо делать, то вам может придти на помощь eval() но помните что это очень плохая практика.

var materials = [{width: 10}, {width: 20}] 
 
function getFromTable(i, arr, property) { 
  var execCmd = arr + '[' + i + ']' + '["' + property + '"]'; 
  return eval(execCmd); 
} 
 
console.log(getFromTable(1, 'materials', 'width'));

Answer 2

Суть в следующем : чтобы не испорльзовать eval сделаем 1н обьект, который будет хранить все таблицы, названия таблиц будут названиями свойств обьекта, а значениями етих свойств будут масивы/данные етих таблиц, в таком случаи данные легко достать с общего масива и легко добавить новые или удалить старые

Пример такого кода :

'use strict'; 
 
var tabels = { 
	tab1 : [ 
	{prop1 : "p1", 
	 prop12 : "p12"}, 
	{prop2 : "p2"}, 
	{prop3 : "p3"} 
	], 
		tab2 : [ 
	{prop1 : "p1"}, 
	{prop2 : "p2"}, 
	{prop3 : "p3"} 
	] 
}; 
    
function getFromTable(index, arr, property){ 
	return tabels[arr][index][property]; 
}; 
    
console.log(getFromTable(0,'tab1','prop12'));

READ ALSO
Javascript ООП?

Javascript ООП?

Пытаюсь изучить ООП javascript на реальный примерах и столкнулся с проблемойЕсть такой код:

340
Как изменить функцию работы меню?

Как изменить функцию работы меню?

Добрый день! У меня есть скрипт менюНа пк меню работает при наведении мышкой

265
SailsJs You have triggered an unhandledRejection, you may have forgotten to catch [требует правки]

SailsJs You have triggered an unhandledRejection, you may have forgotten to catch [требует правки]

You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:

377
Работа с Google Cloud MySQL

Работа с Google Cloud MySQL

Немогу найти примера как работать с Google Cloud MySQLЯ думаю все просто - через API, но немогу понять как? Может кто-то делал и покажет пример с основными...

282