Javascript:动态选择带有方括号表示法的变量

时间:2018-08-23 05:56:00

标签: javascript javascript-objects

我正在研究一个将两个数字数组作为参数的函数。我使用三元运算符来确定两个数组的长度是否相同。如果没有,我将运行一个if条件循环来确定哪个更长,并将参数名设置为名为longer的变量的属性,这样我就可以在不知道它是哪个的情况下访问最多的元素。这是一个示例。

someFunc(numListA, numListB){
    let isEqual = (numListA.length == numListB.length) ? true : false;

    let longer     = '',
        shorter    = '',
        difference = [longer].length - [shorter].length,
        appendNums = [];

    if(!isEqual){
        if(numListA.length > numListB.length){
            longer = 'numListA'; shorter = 'numListB';
        }
        else{ longer = 'numListB'; shorter = 'numListA'; }

        appendNums = [...[longer].splice([longer].length-difference-1, [longer].length)];
    }
    ........
}

console.log()变量appendNums时,它以字符串形式返回longer变量中的文本,而不是将变量插入我可以访问的位置。

我希望函数的这一部分要做的是确定两个数组之间的长度差,并取最长的结尾项并将其存储在appendNums变量中。我唯一想做的就是尝试使用反引号而不是引号使它们成为模板文字,但是结果仍然相同。如何获得括号符号以插入变量名以便可以访问它?

3 个答案:

答案 0 :(得分:2)

首先,这段代码

difference = [longer].length - [shorter].length

将始终为0,因为您正在访问新创建的数组中的属性.length,该数组仅包含一个元素-longershorter(也可能是数组,但这只是新数组中的一项,对父数组的长度不起作用。

我认为您通过使用通过计算属性使用变量名称访问数组来过度考虑问题。您已经在变量中拥有两个数组,并且都易于访问,并且您确切知道要比较的两个变量,因此即使可以使用计算属性访问也没有意义。

要做您想要实现的目标的最简单算法如下所示:

  1. 一个函数接收两个参数-两个要比较的数组
  2. 确定哪个数组更长,并将其保存在新变量中
  3. Slice the longer array,从等于较短数组中最后一个索引的索引开始,一直到较长数组的末尾(从而创建较长数组中所有尾随项​​目的浅表副本)
  4. 使用切片执行您想要的操作。现在,所有尾随项​​目都在一个新数组中。

如您所见,您不需要任何疯狂的语法或技巧。这是该算法的参考实现:

function getTrailingItems(first, second) {
  if (first.length === second.length) {
    // They are equal -> no trailing items exist
    return []
  }

  // Determine which array of the two is longer and which one is shorter.
  // We will use this to make the final slice.
  const longer = first.length > second.length
    ? first
    : second
  const shorter = first.length > second.length
    ? second
    : first

  // Create a shallow copy of all the extra elements at the end of the longer array.
  return longer.slice(shorter.length)
}

答案 1 :(得分:1)

使用实际变量代替依赖变量名。 []语法是计算属性语法,仅适用于对象属性。

if(numListA.length > numListB.length){
    longer = numListA; shorter = numListB;
}
else{
    longer = numListB; shorter = numListA;
}

appendNums = [...longer.splice(longer.length-difference-1, longer.length)];

如果要依赖变量名,可以使用eval来评估字符串变量,但是不推荐使用。

appendNums = [...eval(longer).splice(eval(longer).length-difference-1, eval(longer).length)];

答案 2 :(得分:1)

var numListA = [1, 2, 3, 4, 5];
var numListB = [12, 14, 15, 16, 18, 20];

function execFunc() {
  someFunc(numListA, numListB);
}

function someFunc(numListA, numListB) {
  let isEqual = (numListA.length == numListB.length) ? true : false;

  let longer = '',
    shorter = '',
    difference = longer.length - shorter.length,
    appendNums = [];

  if (!isEqual) {
    if (numListA.length > numListB.length) {
      longer = numListA;
      shorter = numListB;
    } else {
      longer = numListB;
      shorter = numListA;
    }

    appendNums = [[...longer].splice([...longer].length - difference - 1, [...longer].length)];
  }
  console.log(appendNums);
}
<button onclick="execFunc()">Click me</button>