我有两个对象数组。我想迭代这两个数组中的每一个并添加一个属性(“IsPriced”)。然后我想将两个数组组合成一个数组。遍历数组并合并两个数组
我该如何在JavaScript中做到这一点(与MooTools很好,但不是与jQuery请)?
我真的不知道从哪里开始。
我有两个对象数组。我想迭代这两个数组中的每一个并添加一个属性(“IsPriced”)。然后我想将两个数组组合成一个数组。遍历数组并合并两个数组
我该如何在JavaScript中做到这一点(与MooTools很好,但不是与jQuery请)?
我真的不知道从哪里开始。
你可以在两个数组第一组合,然后遍历只有一个组合:
// assuming that your arrays are called array1 and array2:
var combined = array1.concat(array2);
var n = combined.length;
while(n--) {
combined[n].isPriced = true; // or maybe call a getIsPriced function
}
我用一个反向循环的,因为你只需要一个属性添加到所有的元素,你真的不关心关于迭代的顺序。
+1不错,超级简洁。爱它! – 2010-01-07 05:33:21
for (key in myArray1)
myArray1[key].isPrice = 123;
for (key in myArray2)
myArray2[key].isPrice = 123;
result = myArray1.concat(myArray2);
for-in用于迭代特定对象的所有属性,对于数组,此属性将包含.length属性,因为长度不是对象,因此不允许添加isPrice属性,因此不应使用for-in迭代数组元素 – jerjer 2010-01-07 05:39:26
@jerjer :你说的对,'for ... in'语句在迭代数组时应该总是被避免。关于'length',在大多数实现中,这个属性不是可枚举的,它不会被迭代('[] .propertyIsEnumerable('length')== false'),但是这个代码另一个关键问题是''key '变量变成全局变量('window.key'被创建)... – CMS 2010-01-07 05:52:22
var totalArr = new Array();
for (var i = 0; i < arr1.length; i++)
{
arr1[i].isPriced = {};
totalArr.push(arr1[i]);
}
for (var i = 0; i < arr2.length; i++)
{
arr2[i].isPriced = {};
totalArr.push(arr1[i]);
}
可以使用concat
到阵列组合,和each
(从MooTools的)到一个函数应用到每个项中的组合阵列英寸
var first = [{a: "something"}, {b: "or other"}];
var second = [{d: "string"}, {e: "last object"}];
var combined = first.concat(second);
combined.each(function (item) {
item.IsPriced = 10;
});
each
由MooTools的定义,因此,如果您已经使用MooTools的,你不妨利用这一点。 ECMAScript现在提供了一个可以做同样事情的forEach
方法,但在所有浏览器上可能都不可用。如果你想用标准的方法,下面的定义应该将其添加到已经不支持它的浏览器(从MDC文章,下MIT license行货):
if (!Array.prototype.forEach)
{
Array.prototype.forEach = function(fun /*, thisp*/)
{
var len = this.length >>> 0;
if (typeof fun != "function")
throw new TypeError();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
fun.call(thisp, this[i], i, this);
}
};
}
要合并两个数组a1
和a2
可以使用
var combined = a1.concat(a2);
这将创建一个新的阵列组合a1
和a2
。 如果要追加的a2
的内容a1
你可以使用的方法描述in this StackOverflow post:
a1.push.apply(a1, a2);
一个新属性添加到普通的JavaScript每一个新的元素,最好是使用这种方法:
combined.map(function(item){item.newProperty = "someValue";});
这可以避免手动迭代阵列。但请注意,Array.filter()
是在JavaScript 1.6中引入的。
你是什么意思的“添加属性”?添加一个属性到数组的每个元素? – 2010-01-07 05:25:22
是的。他们的元素是对象。因此,如果当前对象是'foobar',代码将是foobar.IsPriced = ... – JamesBrownIsDead 2010-01-07 05:27:49
要在javascript中添加属性,您只需...好...添加一个属性。只是宣布你的'foobar.IsPriced = yourValue',所以它应该是。 – Jason 2010-01-07 05:30:30