2012-03-13 72 views
4

也许是微不足道的,但一个阵列中的元素被另一个阵列分隔的优雅方式是什么(假设阵列长度相等)?例如将元素划分为一个数组中的元素?

var A = [2,6,12,18] 
var B = [2,3,4,6] 

划分应该给我:[1,2,3,3]

+1

许愿的JavaScript已经内置的ZIP方法,是吗? :-) – 2012-03-13 05:49:37

+0

@RayToal::)有些习惯不会死亡,不管是什么! – Legend 2012-03-13 05:50:17

+0

哦,我想我的解决方案已经足够小了。 :P – 2012-03-13 05:50:57

回答

13

如果你有ES5的支持,这可能是一个不错的选择:

var result = A.map(function(n, i) { return n/B[i]; }); 

其中n回调代表th在Ai中的重复数字是在A中的n的索引。

+0

+1可能符合OP的“花哨”标准 – 2012-03-13 05:54:44

+0

[ecma5地图]( http://ecma262-5.com/ELS5_HTML.htm#Section_15.4.4.19),[来自MDN的映射](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/map)和[数组示例](http://ie.microsoft.com/testdrive/HTML5/ECMAScript5Array/Default.html)。就像其他信息一样。好答案。 – Bakudan 2012-03-13 06:09:02

3

假设两个数组始终是相同长度:

var C = []; 
for (var i = 0; i < A.length; i++) { 
    C.push(A[i]/B[i]); 
} 
2

本身没有任何优雅的方法,就像避免使用整齐的技巧的forloop一样。有一些方法使用已经列出的map()。那些最终使用(更长)forloop,但他们是更小的代码段。否则,使用此:

var C= new Array(A.length) 
for(i=0;i<A.length;i++){ 
    C[i]=A[i]/B[i]; 
} 
+0

是的,你是这么认为的。 – Bakudan 2012-03-13 05:59:42

+0

@Bakudan啊,我明白你的意思了。 – Manishearth 2012-03-13 06:02:21

+4

Eeeck。你不应该用'for(我在A)'中迭代数组。这将检索对象的属性,并可以返回除数组元素之外的其他内容。 – jfriend00 2012-03-13 06:04:35

2

如果您考虑改变数组原型的选项:

Array.prototype.zip = function (other, reduce, thisArg) { 
    var i, result = [], args, 
     isfunc = typeof reduce == "function", 
     l = Math.max(this.length, other.length); 

    for (i=0; i<l; i++) { 
    args = [ this[i], other[i] ]; 
    result.push(isfunc ? reduce.apply(thisArg, args) : args); 
    } 
    return result; 
} 

var A = [2,6,12,18] 
var B = [2,3,4,6] 
var C = A.zip(B, function (l, r) { return l/r; }); 
// -> [1, 2, 3, 3] 
+0

增加一个可选的第三个参数来指定''''''reduce'函数中使用的'this'的值是什么?这与采用函数参数的其他数组迭代器方法一致。 – gilly3 2012-03-13 06:30:56

+0

@ gilly3绝对。我会改变这个功能。 – Tomalak 2012-03-13 06:35:21

相关问题