JavaScript数组在奇数索引处分割

5
我有一个产品数组,其中包含产品名称和制造商,例如"product","manufacturer","product","manufacturer"等。
我该如何将数组拆分为单独的数组,以便我可以将产品和制造商分开存放在不同的数组中?我想在每个奇数索引处拆分它,这样我就可以将制造商从数组中取出并添加到新数组中?
谢谢。
8个回答

13
/**
 * @param candid Array of results
 * @return Returns an array where index 0 = array of even ones, and index 1 = array of odd ones
*/
function splitArray(candid) {
    var oddOnes = [],
        evenOnes = [];
    for(var i=0; i<candid.length; i++)
        (i % 2 == 0 ? evenOnes : oddOnes).push(candid[i]);
    return [evenOnes, oddOnes];
}

5

尝试使用以下内容:

var arr = ["product","manufacturer","product","manufacturer"];
var products = [];
var manufacturers = [];
for (var i = 0; i < arr.length; i += 2) {
    products.push(arr[i]);
    arr[i+1] && manufacturers.push(arr[i + 1]);
}

这确实会让你容易出现偏移一个的错误。*(是的,我知道JS不会崩溃,但这仍然不是一个好主意。)* - ChaosPandion
循环应该是 i<arr.length - 1 或者最后一行应该是 arr[i+1] && manufacturers.push(arr[i+1]) 或者 manufacturers.push(arr[i+1] || ''),以处理数组缺少最后一个值的情况。 - user578895
是的,我写它希望能得到最好的结果 :) 感谢您的评论。 - Marcelo

3

Underscore.js的groupBy函数功能非常强大。

_.groupBy(["product", "manufacturer","product", "manufacturer"], function(val, index){ return index % 2; });
=> {1: ["product", "product"], 2: ["manufacturer", "manufacturer"]}

似乎不起作用。我得到了 NaN: Array(4) ["product", "manufacturer", "product", "manufacturer"] - kiradotee

0

这应该可以工作:

function separate(array) {
    var products = [],
        manufacturers = [];
    for (var i = 0, length = array.length; i < length; i++) {
        if (i % 2 === 0) {
            products.push(array[i]);    
        } else {
            manufacturers.push(array[i]);  
        }        
    }
    return {
        products: products,
        manufacturers: manufacturers 
    };
}

jsFiddle示例


0

编辑:我的回复有点晚了。我强烈建议您选择其他人做同样的事情。

如果您的数组看起来像这样:

var result = ["Product #1", "ABC Company", "Product #2", "DEF Company"];

您可以使用 for 循环来提取产品和制造商。
var products = [];
var manufacturers = [];
for (var i = 0; i < results.length; ++i) {
    if (i % 2 === 0) {
        products.push(products[i]);
    } else {
        manufacturers.push(products[i]);
    }
}

0

好的,这里是另一篇文章:

var arr = ['p0','m0','p1','m1','p2'];
var products = [];
var manufacturers = [];
var i = 0, iLen = arr.length;

while (i < iLen) {
  manufacturers.push(arr[i++]);
  products.push(arr[i++]);
}

如果顺序不重要,那么:

var i = arr.length;
while (i) {
  i && manufacturers.push(arr[--i]);
  i && products.push(arr[--i]);
}

如果您绝对相信长度是偶数:

var i = arr.length;
while (i) {
  manufacturers.push(arr[--i]);
  products.push(arr[--i]);
}

但如果长度为奇数,那么它将进入无限循环。


0

另一种使用递归的方法 :)

var split = function(arr) {
    var splitHelper = function(arr, odd, even) {
        if (arr.length == 0) {
            return {odd: odd, even: even};
        }
        odd.push(arr.splice(0, 1)[0]);
        arr[0] && even.push(arr.splice(0, 1)[0]);
        return splitHelper(arr, odd, even);
    };
    return splitHelper(arr, [], []);
};

var arr = ["product", "manufacturer", "product", "manufacturer"];
var arrays = split(arr);
// Test
alert("odd: " + arrays.odd);
alert("even: " + arrays.even);

0
使用数学和模运算符。
通过索引(可能是 i)遍历数组并检查 i 的值。
if (i % 2 == 0){
goes_to_even_array();
]else{
goes_odd_array();
}

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