如果javascript数组存在,则向其推入值,否则先创建它

14

有没有办法让这行代码始终正常工作,而不会抛出TypeError:Cannot read property 'Whatever' of undefined

var MyArray = [];
MyArray[StringVariableName][StringVariableName2].push("whatever");

1
MyArray = MyArray || []; - Cory Danielson
5个回答

19

试试这个:

var MyArray = [];
MyArray[StringVariableName] = MyArray[StringVariableName] || [];
MyArray[StringVariableName][StringVariableName2] = MyArray[StringVariableName][StringVariableName2] || [];
MyArray[StringVariableName][StringVariableName2].push("whatever");

工作得非常好,你能解释一下那个赋值的意思吗? - Nadav Miller
@NadavMiller 这只是一个逻辑或运算。如果第一部分为真,则不执行第二部分,而将第一部分赋值给变量。 - Sachin Jain
这是逻辑或运算符,它的作用很简单:如果左操作数是真值,则返回它,否则返回右侧操作数。 - ppoliani

3
你甚至可以通过表达式的力量使用一行代码实现这个功能。
(MyArray[StringVariableName][StringVariableName2] || (MyArray[StringVariableName][StringVariableName2] = [])).push("whatever");

这太棒了。这种方法有性能滞后吗? - Sajith Mantharath

0
我认为,如果你的键不是整数,那么在第一次使用时,应该使用对象而不是数组。在JavaScript中,数组也是对象,因此这样做并没有错。
var a = [];
a['key'] = 'something';

console.log(a); //Gives []

我认为这在概念上是错误的,所以你应该使用对象来保存这样一对数据,而不是使用数组。看看这个例子:

var myObject = myObject || {};
myObject[str1] = myObject[str1] || {};
myObject[str1][str2] = myObject[str][str2] || [];

// Now myObject[str1][str2] is an array. Do your original operation

myObject[str1][str2].push("whatever");

.push() 用于数组,而不是对象。 - adrien
@A__ 我们两个都是正确的,因为myObject[str1][str2]在这里是一个数组而不是一个对象。 - Sachin Jain

0

你可以使用字面量语法来设置你想要的东西:

var myObj = {
    StringVariableName: {
        StringVariableName2: []
    }
};

myObj.StringVariableName.StringVariableName2.push("whatever");

你做错了,因为StringVariableName看起来实际上是一个变量名。你正在将它们作为对象中的常量键。 - Sachin Jain

0

在不出现错误的情况下进行检查:

这段代码片段允许您检查链接对象是否存在。

var x;
try{x=MyArray[name1][name2][name3][name4]}catch(e){}
!x||(x.push('whatever'));

来自

https://dev59.com/eXI-5IYBdhLWcg3wqqXh#21353032

Javascript中对象链的简写创建

这个函数允许你使用一个简单的字符串创建链接对象。

function def(a,b,c,d){
 c=b.split('.');
 d=c.shift();//add *1 for arrays
 a[d]||(a[d]={});//[] for arrays
 !(c.length>0)||def(a[d],c.join('.'));
}

使用方法

var MyArray={};//[]
def(MyArray,'name1.name2.name3.name4');//name1+'.'+name2....

来自

https://stackoverflow.com/a/21384869/2450730

对于数组,只需进行简单的更改即可使用两种方式。将{}替换为[]

如果您有任何问题,请随时提问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接