#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 , и закрытие обеспечит соответствующее имя свойства для доступа.