如何从map()函数中正确传递变量

时间:2016-10-03 05:07:00

标签: javascript jquery json map-function

我有以下代码,它根据JSON数据的2个不同部分创建变量。

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键。如何将这两个函数合并为一个,从map函数传入JSON变量?

这样的事情不起作用:

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);
}

3 个答案:

答案 0 :(得分:2)

简单易用,如下所示:

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闭包概念的美妙。

参考

Array.Map上有关地图功能及其参数的更多说明的文档

答案 1 :(得分:1)

您可以对对象属性使用括号表示法,以便可以使用变量。你的功能看起来像这样:

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

然后称之为:

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

答案 2 :(得分:0)

如果您希望结合此功能,可以按照以下方式使用闭包和实现功能。

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

在稍后阶段,只需调用您在代码中描述的showKey函数。内部函数将由map调用,通过传递数组元素,闭包将确保访问相应的属性名称。