Javascript:使用括号表示法动态选择变量

Javascript:使用括号表示法动态选择变量,javascript,javascript-objects,Javascript,Javascript Objects,我正在研究一个函数,它以两个数字数组作为参数。我使用三元运算符来确定两个数组的长度是否相同。如果不是,我运行If条件循环来确定哪个更长,并将参数的名称设置为名为longer的变量的属性,这样我就可以访问项目最多的元素,而不必事先知道它是哪个。这是一个样品 someFunc(numListA, numListB){ let isEqual = (numListA.length == numListB.length) ? true : false; let longer =

我正在研究一个函数,它以两个数字数组作为参数。我使用三元运算符来确定两个数组的长度是否相同。如果不是,我运行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
变量中。我所能想到的唯一一件事就是尝试使用反勾号而不是引号来生成模板文本,但结果仍然是一样的。如何让括号符号插入变量名以便访问它?

使用实际变量,而不是依赖变量名<代码>[]语法是仅适用于对象属性的计算属性语法

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)];
var numListA=[1,2,3,4,5];
var numListB=[12,14,15,16,18,20];
函数execFunc(){
someFunc(numListA,numListB);
}
函数someFunc(numListA,numListB){
设isEqual=(numListA.length==numListB.length)?true:false;
让我们来看看,
较短=“”,
差异=长.length-短.length,
附件=[];
如果(!相等){
if(numListA.length>numListB.length){
更长=努姆利斯塔;
短=numListB;
}否则{
长=numListB;
更短=努姆利斯塔;
}
appendNums=[…更长].拼接([…更长].length-difference-1,[…更长].length)];
}
console.log(appendNums);
}

点击我
首先,这段代码

difference = [longer].length - [shorter].length
将始终为0,因为您正在访问新创建的数组上的属性
.length
,该数组只包含一个元素-
longer
shorter
(该数组也可能是数组,但它只是新数组中的一个项,在父数组的长度中不起作用)

我认为您试图通过使用计算属性来使用变量名称来访问数组,这是对问题的过度考虑。变量中已经有两个数组,可以随时访问,并且您确切地知道要比较哪两个变量,因此即使可以使用计算属性访问,也没有任何意义

要实现您试图实现的目标,最简单的算法如下所示:

  • 函数接收两个参数-两个要比较的数组
  • 确定哪个数组较长,并将其保存在新变量中
  • ,从与较短数组中的最后一个索引相等的索引开始,运行到较长数组的末尾(从而创建较长数组中所有尾随项的浅拷贝)
  • 你想怎么做就怎么做。现在,新数组中有了所有尾随项
  • 正如您所看到的,您不需要任何疯狂的语法或技巧来做到这一点。以下是该算法的参考实现:

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

    longer='numListA'
    应该是
    longer=numListA
    同样适用于
    shorter
    alsoI我还没有完全理解代码,但我认为你已经使用了
    [longer].length
    甚至在你决定
    longer
    (此时,
    longer
    shorter
    都是空字符串。)“如何让括号符号插入变量名以便访问它?”在给定的情况下,您不能直接使用该变量名的文本版本访问该值。您似乎认为符号
    [variableName]
    将返回分配给变量的任何内容,该变量的名称存储在
    variableName
    中。但这不是真的:例如,第7行中的
    [longer]
    计算为单例数组
    [']
    而不是指定给名称与
    longer
    值匹配的变量的数组。通常,如果不使用
    eval
    ,则无法以反射方式访问函数的范围。如果您遵循@JavascriptLover SKT的建议,也不需要这样做。您不应该在没有任何解释你改变了什么以及为什么。OP或任何其他有问题的人都不会尝试使用
    []
    如果他们很清楚,他们可以使用实际对象的赋值。对于
    eval
    ,有各种有效的用例,以这种方式访问变量肯定是最糟糕的选择之一。它很可能会破坏linter、minifier、composer、transpilers等等。。。