2016-10-11 4 views
0

Мне нужно сопоставить значение нескольких textareas с свойствами объекта. Это должно быть только матч, если:Доступ к локальной переменной в другой функции без использования глобального

  1. значение textarea используется равно имя человека, содержащегося в объекте и
  2. если индекс текстового поля равен ID человека. (Cf булевых в моей скрипке: https://jsfiddle.net/Lau1989/hxcpstty/1/)

Для этого мне нужно получить доступ к объекту test = {} от этой функции:

function make_test(name, job, ID) { 
    var test = {}; //local variable to be used in 'function suggest(index)' 
    test.name = name; 
    test.job = job; 
    test.ID = ID; 
    return test; 
} 
new make_test("Paul", "manager", 1); 
new make_test("John", "employee", 2); 
new make_test("Jan", "employee", 2); 

Внутри одного:

function suggest(index) { 
    if (test.ID === index && test.name == thisInput.value) { 
     thisOutput.innerHTML = "Has job : " + test.job; //should access 'test' properties : test.name, test.job, test.ID 
    } 
} 

проблемы является что объявление test = {}; в качестве глобальной переменной позволит только function suggest(index) найти «Ян», потому что это последний, который я объявил. Но если я объявлю var test = {}; в качестве локальной переменной, он не будет работать вообще, потому что function suggest(index) не может получить доступ к var test = {}; снаружи.

Здесь я застрял. Моя цель - получить доступ к var test = {}; в пределах suggest(), чтобы получить работу каждого человека в зависимости от их name и ID.

Спасибо за вашу помощь

+1

Вам нужен массив для хранения ссылок на всех людей, или, если идентификатор сотрудника уникален (что не является * в вашем примере), вы можете использовать объект вместо массива. Кроме того, при вызове функции вам не нужно 'new'. Итак: 'var employees = []; employees.push (make_test (...)); '. – nnnnnn

+1

@Jecoms Было предложено, чтобы ОП задал другой вопрос о функции 'предлагать' http://stackoverflow.com/questions/39968429/dynamically-access-function-object-property#comment67216922_39968451 – guest271314

+0

@nnnnnn: Это то, что я пытался сделать сначала, но тогда у них не будет двух других свойств, которые мне нужны, чтобы сопоставить их (задание и идентификатор), если я не надавливаю объекты в массиве? Сначала я хотел избежать использования массива объектов, так как итерация через массив плюс объект будет печатать несколько раз те же результаты.Возможно, я ошибаюсь, так как я все еще пытаюсь расширить свои знания в javascript. – Lau

ответ

2

Учитывая, что ваши идентификаторы работника, кажется, не быть уникальным, я предлагаю вам хранить все люди в массиве, а затем в вашей suggest() функции вы можете осуществлять поиск по массиву, чтобы проверить на матч (нажмите Выполнить фрагмент кода попробовать его):

function make_test(name, job, ID) { 
 
    var test = {}; 
 
    test.name = name; 
 
    test.job = job; 
 
    test.ID = ID; 
 
    return test; 
 
} 
 

 
var people = []; 
 

 
people.push(make_test("Paul", "manager", 1)); 
 
people.push(make_test("John", "employee", 2)); 
 
people.push(make_test("Jan", "employee", 2)); 
 

 
function suggest(index) { 
 
    var thisInput = document.getElementById("textarea" + index); 
 
    var thisOutput = document.getElementById("output" + index); 
 

 
    thisOutput.innerHTML = "Has job:"; 
 

 
    for (var i = 0; i < people.length; i++) { 
 
    if (people[i].ID === index && people[i].name == thisInput.value) { 
 
     thisOutput.innerHTML = "Has job: " + people[i].job; //should access 'test' properties : test.name, test.job, test.ID 
 
     break; 
 
    } 
 
    } 
 
}
<table> 
 
    <tr> 
 
    <td><textarea onkeyup="suggest(1)" name="response" id="textarea1" cols="30" rows="5"></textarea></td> 
 
    <td><div id="output1">Has job :</div></td> 
 
    </tr> 
 
    <tr> 
 
    <td><textarea onkeyup="suggest(2)" name="response" id="textarea2" cols="30" rows="5"></textarea></td> 
 
    <td><div id="output2">Has job :</div></td> 
 
    </tr> 
 
</table>

Обратите внимание, что это не имеет смысла для вызова функции make_test() с new, потому что вы вручную создать новый объект внутри функции.

+0

Спасибо, ваше решение идеально! Я также узнал новые трюки, которые помогут мне отладить дальнейшие проблемы. – Lau

+0

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

1

Как было предложено @nnnnnn, вы можете хранить объект, возвращаемый make_test в массиве; передать массив suggest, используйте Array.prototype.forEach() итерировать массиву

window.onload = function() { 
 

 
    function make_test(name, job, ID) { 
 
    var test = {}; //local variable to be used in 'function suggest(index)' 
 
    test.name = name; 
 
    test.job = job; 
 
    test.ID = ID; 
 
    return test; 
 
    } 
 

 
    var thisInput = document.querySelector("input"); 
 

 
    var thisOutput = document.querySelector("output"); 
 

 
    var arr = []; 
 

 
    arr.push(make_test("Paul", "manager", 1), 
 
    new make_test("John", "employee", 2), 
 
    new make_test("Jan", "employee", 2)); 
 

 
    function suggest(index, arr) { 
 
    arr.forEach(function(test) { 
 
     if (test.ID === index && test.name == thisInput.value) { 
 
     thisOutput.innerHTML = "Has job : " + test.job; 
 
     } 
 
    }) 
 
    } 
 

 
    suggest(1, arr); 
 

 
}
<input type="text" value="Paul"> 
 
<output></output>

Смежные вопросы