2010-01-07 168 views
0

我有两个对象数组。我想迭代这两个数组中的每一个并添加一个属性(“IsPriced”)。然后我想将两个数组组合成一个数组。遍历数组并合并两个数组

我该如何在JavaScript中做到这一点(与MooTools很好,但不是与jQuery请)?

我真的不知道从哪里开始。

+0

你是什么意思的“添加属性”?添加一个属性到数组的每个元素? – 2010-01-07 05:25:22

+0

是的。他们的元素是对象。因此,如果当前对象是'foobar',代码将是foobar.IsPriced = ... – JamesBrownIsDead 2010-01-07 05:27:49

+0

要在javascript中添加属性,您只需...好...添加一个属性。只是宣布你的'foobar.IsPriced = yourValue',所以它应该是。 – Jason 2010-01-07 05:30:30

回答

4

你可以在两个数组第一组合,然后遍历只有一个组合:

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

我用一个反向循环的,因为你只需要一个属性添加到所有的元素,你真的不关心关于迭代的顺序。

+2

+1不错,超级简洁。爱它! – 2010-01-07 05:33:21

-1
for (key in myArray1) 
    myArray1[key].isPrice = 123; 
for (key in myArray2) 
    myArray2[key].isPrice = 123; 
result = myArray1.concat(myArray2); 
+0

for-in用于迭代特定对象的所有属性,对于数组,此属性将包含.length属性,因为长度不是对象,因此不允许添加isPrice属性,因此不应使用for-in迭代数组元素 – jerjer 2010-01-07 05:39:26

+0

@jerjer :你说的对,'for ... in'语句在迭代数组时应该总是被避免。关于'length',在大多数实现中,这个属性不是可枚举的,它不会被迭代('[] .propertyIsEnumerable('length')== false'),但是这个代码另一个关键问题是''key '变量变成全局变量('window.key'被创建)... – CMS 2010-01-07 05:52:22

0
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]); 
} 
1

可以使用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); 
    } 
    }; 
} 
1

要合并两个数组a1a2可以使用

var combined = a1.concat(a2); 

这将创建一个新的阵列组合a1a2。 如果要追加的a2的内容a1你可以使用的方法描述in this StackOverflow post

a1.push.apply(a1, a2); 

一个新属性添加到普通的JavaScript每一个新的元素,最好是使用这种方法:

combined.map(function(item){item.newProperty = "someValue";}); 

这可以避免手动迭代阵列。但请注意,Array.filter()是在JavaScript 1.6中引入的。