Как правильно передавать переменные из функции map()

#javascript #jquery #json #map-function

#javascript #jquery #json #map-функция

Вопрос:

У меня есть следующий код, который создает переменные на основе 2 разных частей данных JSON.

 function showDescription(implant) {
  return implant.description   '<br />';
}
function showSectionHeadings(implant) {
  return implant.sectionHeading   '<br />';
}
function loadImplantsOfFamily(implantFamily) {
  var implantData = JSON.parse(getLocal("implantData"));
  var allImplantsInFamily = implantData.implants.filter(familyToLoad,implantFamily);
  var implantDescription = allImplantsInFamily.map(showDescription);
  var sectionHeading = allImplantsInFamily.map(showSectionHeadings);
  var uniqueVals = sectionHeading.unique();
  $("#holderForImplants").html(uniqueVals);
}
  

Все работает нормально, но две функции, которые у меня есть, идентичны, за исключением ключа JSON, на который они ссылаются. Как мне объединить эти две функции в одну, передав переменную JSON из функции map?

Что-то вроде этого не работает:

 function showKey(implant,key) {
  return implant.key   '<br />';
}
function loadImplantsOfFamily(implantFamily) {
  var implantData = JSON.parse(getLocal("implantData"));
  var allImplantsInFamily = implantData.implants.filter(familyToLoad,implantFamily);
  var implantDescription = allImplantsInFamily.map(showKey("description"));
  var sectionHeading = allImplantsInFamily.map(showKey("sectionHeading"));
  var uniqueVals = sectionHeading.unique();
  $("#holderForImplants").html(uniqueVals);
}
  

Комментарии:

1. Используйте implant[key] . implant.key буквально пытается получить key свойство

2. Извините, @AndrewL., я должен был сказать, я только что сделал этот последний бит, я мог бы легко ввести whatever вместо key .

3. Спасибо @Nirus, к сожалению, у меня не будет возможности протестировать эти решения в течение нескольких часов, но как только я это сделаю, я обязательно отмечу одно из них как решение. Приветствую, приятель

Ответ №1:

Простое в использовании закрытие, как показано ниже:

 function showKey(implant,key) {
   return function(elem, index, arr){ //Catch 'elem', 'index', 'arr' - Element passed by Map function. Checkout the documentation for more on this.
      return implant[key]   '<br />';
   } 
}
  

Простой пример:

 var a = {one:1, two:2}
var b = {three:3, four: 4};

var dynamic = function(obj, key){
  return function(el){ //Closure call to save the key. 'el' will be element injected from Map function
        console.log(obj[key])
      return obj[key];
   } 
}

var test = [1, 2, 3];
test.map(dynamic(b, "four"));
test.map(dynamic(a, "one"));
  

https://jsfiddle.net/mdLda62f/

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


Ссылка

Документация по массиву.Карта для более подробного объяснения функции map и ее параметров

Комментарии:

1. Зачем нужно замыкание? return implant[key] '<br />'; кажется, все в порядке

2. OP отправляет ключ динамически. Карта массива принимает ссылку на функцию.

Ответ №2:

Вы можете использовать скобки для обозначения свойств объекта, чтобы вы могли использовать переменную. Ваша функция будет выглядеть примерно так:

 function showDescription(implant, key) {
    return implant[key]   '<br />';
}
  

А затем вызовите его как:

 showDescription(implant, 'description');
showDescription(implant, 'sectionHeading');
  

Комментарии:

1. Похоже, что используется OP map , поэтому вам нужно вернуть функцию.

Ответ №3:

Если вы хотите объединить эту функцию, вы можете использовать закрытие и реализовать функцию следующим образом.

 function showKey(prop){
  return function(obj){
    return obj[prop];
  };
}
  

На более позднем этапе просто вызовите showKey функцию, как вы описали в своем коде. Внутренняя функция будет вызвана путем map передачи элемента array , и закрытие обеспечит соответствующее имя свойства для доступа.