将字符串传递给函数但需要数组

时间:2018-07-16 17:17:01

标签: javascript arrays select

我有一个select下拉列表,在更改时,我希望它运行一个函数并将select的值传递给该函数。但是,该函数期望有一个保存数组的变量,并且传递的是一个字符串(select的值)。

您可以在下面的代码中看到它正常工作(或不正常工作)。所选值应代表其对应的变量。

我该怎么做?

var str = ["Paul", "John", "Melissa", "Mike"];
var int = [8, 4, 55, 7];
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];

var main = document.querySelector('#main');
var sel = document.querySelector('select');


function testFunc(arr){
  arr.forEach((i) => {
    var p = document.createElement('p');
    p.innerHTML = i;
    main.appendChild(p);
  });
}

testFunc(mix);

sel.addEventListener('change', testFunc(sel.value));
<select>
  <option value="str">String</option>
  <option value="int">Integer</option>
  <option value="mix">Mixed</option>
</select>

<div id="main"></div>

编辑:

我应该注意,数据数组是动态输入的,我真的想避免对其进行操作,以免在以后的编辑中引起额外的代码和混乱。

5 个答案:

答案 0 :(得分:1)

您的代码中有两个问题:

  1. 在事件处理函数中,通过在函数之后指定括号,可以在页面加载时调用该函数。只需在函数体内调用函数即可。这将使函数仅在事件触发时被调用。

  2. sel.value是一个字符串,但是该函数需要一个数组。要评估数组,请动态地将testFunc(mix)更改为testFunc('mix')(用引号引起来的参数值)并使用window对象,如:

    arr = window[arr]
    

替换:

sel.addEventListener('change', testFunc(sel.value));

使用

sel.addEventListener('change', function (){testFunc([sel.value])});

var str = ["Paul", "John", "Melissa", "Mike"];
var int = [8, 4, 55, 7];
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];

var main = document.querySelector('#main');
var sel = document.querySelector('select');


function testFunc(arr){
  arr = window[arr]
  arr.forEach((i) => {
    var p = document.createElement('p');
    p.innerHTML = i;
    main.appendChild(p);
  });
}

testFunc('mix');

sel.addEventListener('change', function (){testFunc(sel.value)});
<select>
  <option value="str">String</option>
  <option value="int">Integer</option>
  <option value="mix">Mixed</option>
</select>

<div id="main"></div>

答案 1 :(得分:1)

据我了解,您想这样做:

let model = {
    str : ["Paul", "John", "Melissa", "Mike"];
    int : [8, 4, 55, 7];
    mix : ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];
}


function testFunc(key){
    var arr = []
    if(model[key]){
        arr = model[key]
    }


    //TODO: clear parent node...
    arr.forEach((i) => {
        var p = document.createElement('p');
        p.innerHTML = i;
        main.appendChild(p);
    });
}

答案 2 :(得分:1)

arr = eval(arr);

var str = ["Paul", "John", "Melissa", "Mike"];
var int = [8, 4, 55, 7];
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2];

var main = document.querySelector('#main');
var sel = document.querySelector('select');


function testFunc(arr){
  arr = eval(arr);
  arr.forEach((i) => {
    var p = document.createElement('p');
    p.innerHTML = i;
    main.appendChild(p);
  });
}

testFunc(mix);

sel.addEventListener('change', function(){testFunc(this.value)});
<select>
  <option value="str">String</option>
  <option value="int">Integer</option>
  <option value="mix">Mixed</option>
</select>

<div id="main"></div>

答案 3 :(得分:1)

一些需要更改的地方:

  • 不要调用传递给addEventListener方法的函数。而是传递一个函数引用。它可以是内联函数表达式。但是不要这样。

  • 为一个对象变量设置不同的数组属性,因此您可以根据选定的值轻松引用它们。

  • 每当更改选择时清除输出。

  • 根据页面加载时选择的项目触发初始更改。

这是一个有效的版本:

var arr = {
    str: ["Paul", "John", "Melissa", "Mike"],
    int: [8, 4, 55, 7],
    mix: ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2]
};

var main = document.querySelector('#main');
var sel = document.querySelector('select');

function testFunc(arr){
  main.innerHTML = ""; // clear the previous result
  arr.forEach((i) => {
    var p = document.createElement('p');
    p.innerHTML = i;
    main.appendChild(p);
  });
}

sel.addEventListener('change', () => testFunc(arr[sel.value]));
testFunc(arr[sel.value]); // initial load
<select>
  <option value="str">String</option>
  <option value="int">Integer</option>
  <option value="mix">Mixed</option>
</select>

<div id="main"></div>

如果数组是在全局范围内定义的,那么您无能为力,那么只需在新对象中复制对它们的引用即可:

// Defined beforehand: you cannot change this:
var str = ["Paul", "John", "Melissa", "Mike"],
var int = [8, 4, 55, 7],
var mix = ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2]

// In your part of the code, still create array as in above solution:
var arr = {str: str, int: int, mix: mix};
// If you have ES6 support you can shorten the above to:
var arr = {str, int, mix};

答案 4 :(得分:0)

如果我没有误解您的要求,那么您必须对现有的JS变量进行一些细微的更改,并将其更改为Object。之后,尝试使用这种方式,通过使用event

删除现有的元素,将新的段落元素添加到下拉菜单的每次更改main.innerHTML=''

addEventListener https://developer.mozilla.org/en-US/docs/Web/Events/change

对象结构https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Basics

var data_types = {
  str: ["Paul", "John", "Melissa", "Mike"],
  int: [8, 4, 55, 7],
  mix: ["Paul", 9, "John", 5, "Melissa", 67, "Mike", 2]
}

var main = document.querySelector('#main');
var sel = document.querySelector('select');


function testFunc(event) {
   main.innerHTML = '';
  // You can use “this” to refer to the selected element.
  if (!event.target.value) alert('Please Select One');
  var arr = data_types[event.target.value];
  arr.forEach((i) => {
    var p = document.createElement('p');
    p.innerHTML = i;
    main.appendChild(p);
  });
}
  
document.addEventListener('DOMContentLoaded', function() {
  document.querySelector('select[name="data-types"]').onchange = testFunc;
}, false);
<select name="data-types">
  <option value="str">String</option>
  <option value="int">Integer</option>
  <option value="mix">Mixed</option>
</select>

<div id="main"></div>