批量声明JavaScript关联数组
是否有一种方法可以在JavaScript中批量设置关联数组键和值,类似于下面PHP的速记数组声明批量声明JavaScript关联数组,javascript,jquery,arrays,associative-array,object-literal,Javascript,Jquery,Arrays,Associative Array,Object Literal,是否有一种方法可以在JavaScript中批量设置关联数组键和值,类似于下面PHP的速记数组声明 $array = [ 'foo' => 'val1', 'bar' => 'val2', 'baz' => 'val3' ]; 我能想到的在JS中声明关联数组的唯一方法如下: var newArray = new Array(); newArray['foo'] = 'val1'; newArray['bar'] = 'val2'; newArray['baz'] =
$array = [
'foo' => 'val1',
'bar' => 'val2',
'baz' => 'val3'
];
我能想到的在JS中声明关联数组的唯一方法如下:
var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
keys = ['foo', 'bar', 'baz'],
vals = ['val1', 'val2', 'val3'];
for(var i = 0; i < keys.length; i++) {
newArray[ keys[i] ] = vals[i];
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myData = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
init: function() {
this.foo = $('foo');
this.bar = this.foo.find('bar');
this.baz = this.foo.find('baz');
}
}
// then, sometime when you know the DOM is ready
myObject.init();
或者像这样:
var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
keys = ['foo', 'bar', 'baz'],
vals = ['val1', 'val2', 'val3'];
for(var i = 0; i < keys.length; i++) {
newArray[ keys[i] ] = vals[i];
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myData = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
init: function() {
this.foo = $('foo');
this.bar = this.foo.find('bar');
this.baz = this.foo.find('baz');
}
}
// then, sometime when you know the DOM is ready
myObject.init();
不幸的是,JS对象文本似乎不允许计算代码为其属性设置值。如果我将这些属性转换为返回值的方法,而不是将值/引用永久存储在属性中,那么每次调用它们时,它们都必须运行;如果可能的话,我真的不想那样做
提前感谢。PHP的“关联数组”——一组有序的名称/值对——是一种相当罕见的数据结构,作为语言的一种功能而不是作为库类发现尤为罕见。JavaScript还没有它们-。ES6通常会为语言引入更好的迭代语义,以及一个标准的库Map
类型,它利用了这些语义,以便在迭代时访问中的条目;下面是更多
ES6之前
在ES6之前,您可以使用对象,如您所知:
var obj = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var map = new Map([
["foo", "val1"],
["bar", "val2"],
["baz", "val3"]
]);
…但属性没有顺序。如果顺序很重要,则必须单独跟踪顺序,可能需要将关键点放在一个数组中:
var keys = ['foo', 'bar', 'baz'];
var obj = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var i;
for (i = 0; i < keys.length; ++i) {
console.log(obj[keys[i]]);
}
因此,当它得到广泛支持时,这将是等效的形式
更多关于(和)中的Map
不幸的是,JS对象文本似乎不允许计算代码为其属性设置值 是的,有。在您的示例中,
foo
属性将是一个jQuery对象,其中包含一组与CSS选择器foo
匹配的元素(一组可能为空,因为没有foo
元素)
例如:
var obj = {
foo: 6 * 7
};
console.log(obj.foo); // 42
在这样的属性初始值设定项中,不能(目前)使用表达式作为属性名称,只能使用值。在ES6中,还可以对属性名称使用表达式:
// As of ES6
var obj = {
['f' + 'o' + 'o']: 6 * 7
};
console.log(obj.foo); // 42
同时,在ES5中,我们可以这样做,但在初始值设定项中不行:
// Now
var obj = {};
obj['f' + 'o' + 'o'] = 6 * 7;
console.log(obj.foo); // 42
我已经尝试在jQuery中使用JS对象文字,如下所示:
var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
keys = ['foo', 'bar', 'baz'],
vals = ['val1', 'val2', 'val3'];
for(var i = 0; i < keys.length; i++) {
newArray[ keys[i] ] = vals[i];
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myData = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
init: function() {
this.foo = $('foo');
this.bar = this.foo.find('bar');
this.baz = this.foo.find('baz');
}
}
// then, sometime when you know the DOM is ready
myObject.init();
这里有几个问题:
$('foo')
查找带有标记的元素foo
-没有foo
HTML标记。也许你的意思是#foo
或.foo
(或者foo
只是作为div
或span
或任何东西的替身)foo
属性的值已经是jQuery对象,无需在另一个$()
调用中包装它此
在对象初始值设定项内没有特殊意义,它与对象初始值设定项外的此
相同,而不是对正在初始化的对象的引用。也不起作用,因为在初始化属性时,myObject
尚未为其分配任何值。下面是如何计算上面的整体表达式:
myObject
的变量,其值为undefined
=
后面的位)开始赋值表达式var obj = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var map = new Map([
["foo", "val1"],
["bar", "val2"],
["baz", "val3"]
]);
myObject
var myObject = {
foo: $('foo') // or $('#foo') or $('.foo') or whatever it is
};
myObject.bar = myObject.foo.find('bar');
myObject.baz = myObject.bar.data('baz');
或者,您可以使用临时变量执行一些复杂的操作:
var foo, bar, myObject = {
foo: (foo = $('foo')),
bar: (bar = foo.find('bar')),
baz: bar.data('baz')
};
…因为赋值表达式的结果是已赋值的值。(属性和变量之间没有持久的联系。)但是这些临时变量仍然存在。您可以将整个内容包装在一个函数中,以便临时变量仅临时存在:
var myObject = (function() {
var foo, bar;
return {
foo: (foo = $('foo')),
bar: (bar = foo.find('bar')),
baz: bar.data('baz')
};
})();
…但这变得非常复杂。:-)
下面是您的评论: 对什么类型的表达式可以计算为属性值有任何限制吗 不,属性初始值设定项的值的表达式处理与包含属性初始值设定项所属的对象初始值设定项的范围中其他位置的表达式处理完全相同 下面是一个通过jQuery获取一些DOM元素的示例:
var myObject={
foo:$(“.foo”)
};
myObject.bar=myObject.foo.find('.bar');
myObject.baz=myObject.bar.data('baz');
myObject.foo.css(“颜色”、“绿色”);
myObject.bar.css(“颜色”、“蓝色”);
$(“”).html(myObject.baz).appendTo(document.body);//“我就是数据”
这是一个
这是.foo里面的一个.bar
如果您只是试图用一组属性/值对声明一个Javascript对象,您可以这样做:
var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
keys = ['foo', 'bar', 'baz'],
vals = ['val1', 'val2', 'val3'];
for(var i = 0; i < keys.length; i++) {
newArray[ keys[i] ] = vals[i];
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myData = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
init: function() {
this.foo = $('foo');
this.bar = this.foo.find('bar');
this.baz = this.foo.find('baz');
}
}
// then, sometime when you know the DOM is ready
myObject.init();
然后您可以通过以下方式访问:
console.log(myData.foo); // `val1`
console.log(myData.bar); // `val2`
console.log(myData.baz); // `val3`
注意,Javascript没有称为“关联数组”的数据类型。大多数Javascript开发人员使用具有属性名称的对象来解决类似的问题,但Javascript对象并不维护一组有序的属性,它们是无序的
你不能这样做:
var newArray = new Array();
newArray['foo'] = 'val1';
newArray['bar'] = 'val2';
newArray['baz'] = 'val3';
var newArray = new Array(),
keys = ['foo', 'bar', 'baz'],
vals = ['val1', 'val2', 'val3'];
for(var i = 0; i < keys.length; i++) {
newArray[ keys[i] ] = vals[i];
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myData = {
foo: 'val1',
bar: 'val2',
baz: 'val3'
};
var myObject = {
foo: $('foo'),
bar: $(this.foo).find('bar'),
baz: $(this.bar).data('baz')
}
var myObject = {
init: function() {
this.foo = $('foo');
this.bar = this.foo.find('bar');
this.baz = this.foo.find('baz');
}
}
// then, sometime when you know the DOM is ready
myObject.init();
因为此
不会从声明中指向对象本身。Javascript就是不能这样工作。您必须添加