如何在JavaScript中将数组拆分为数组对?

时间:2015-07-11 00:16:35

标签: javascript arrays

我想将数组拆分成数组对

所以var arr=[2,3,4,5,6,4,3,5,5]

将是newarr =[[2,3],[4,5],[6,4],[3,5],[5]]

14 个答案:

答案 0 :(得分:34)

您可以使用js reduce

initialArray.reduce(function(result, value, index, array) {
  if (index % 2 === 0)
    result.push(array.slice(index, index + 2));
  return result;
}, []);

答案 1 :(得分:12)

没有预先烘焙的功能,但这是一个简单的解决方案:

var splitPairs = function(arr) {
    var pairs = [];
    for (var i=0 ; i<arr.length ; i+=2) {
        if (arr[i+1] !== undefined) {
            pairs.push ([arr[i], arr[i+1]]);
        } else {
            pairs.push ([arr[i]]);
        }
    }
    return pairs;
};

答案 2 :(得分:7)

另一个是已经发布的答案的一些混合物。添加它因为阅读了答案后我仍觉得事情可能更容易阅读:

var groups = [];

for(var i = 0; i < arr.length; i += 2)
{
    groups.push(arr.slice(i, i + 2));
}

答案 3 :(得分:7)

Lodash为此提供了一种方法:https://lodash.com/docs/4.17.10#chunk

_.chunk([2,3,4,5,6,4,3,5,5], 2); // => [[2,3],[4,5],[6,4],[3,5],[5]]

答案 4 :(得分:2)

与使用for循环进行比较的方法略有不同。为避免修改原始数组slice,因为JS通过引用传递对象,因此会生成浅表副本。

function pairArray(a) {
  var temp = a.slice();
  var arr = [];

  while (temp.length) {
    arr.push(temp.splice(0,2));
  }

  return arr;
}

var array = [2,3,4,5,6,4,3,5,5];
var newArr = pairArray(array);

function pairArray(a) {
  var temp = a.slice();
  var arr = [];

  while (temp.length) {
    arr.push(temp.splice(0,2));
  }

  return arr;
}

document.write('<pre>' + JSON.stringify(newArr) + '</pre>');

答案 5 :(得分:2)

我会在这种情况下使用lodash

以下是使用_.reduce的解决方案:

return deviceQuery.getResultList();

&#13;
&#13;
var newArr = _(arr).reduce(function(result, value, index) {
  if (index % 2 === 0)
    result.push(arr.slice(index, index + 2));

  return result;
}, []);
&#13;
var arr = [2,3,4,5,6,4,3,5,5];

var newArr = _(arr).reduce(function(result, value, index) {
  if (index % 2 === 0)
    result.push(arr.slice(index, index + 2));
  
  return result;
}, []);

document.write(JSON.stringify(newArr)); // [[2,3],[4,5],[6,4],[3,5],[5]]
&#13;
&#13;
&#13;

答案 6 :(得分:2)

这是使用lodash助手的另一种解决方案:

function toPairs(array) {
  const evens = array.filter((o, i) => i % 2);
  const odds = array.filter((o, i) => !(i % 2));
  return _.zipWith(evens, odds, (e, o) => e ? [o, e] : [o]);
}
console.log(toPairs([2,3,4,5,6,4,3,5,5]));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>

答案 7 :(得分:2)

有可能在没有库的情况下将数组成对/成组地排成一行:

function chunks(arr, size = 2) {
  return arr.map((x, i) => i % size == 0 && arr.slice(i, i + size)).filter(x => x)
}
console.log(chunks([1, 2, 3, 4, 5, 6, 7])) // -> [[1, 2], [3, 4], [5, 6], [7]]

答案 8 :(得分:1)

这是一个很好的通用解决方案:

function splitInto(array, size, inplace) {
    var output, i, group;

    if (inplace) {
        output = array;

        for (i = 0; i < array.length; i++) {
            group = array.splice(i, size);

            output.splice(i, 0, group);
        }
    } else {
        output = [];

        for (i = 0; i < array.length; i += size) {
            output.push(array.slice(i, size + i));
        }
    }

    return output;
}

对于您的情况,您可以这样称呼它:

var arr= [2,3,4,5,6,4,3,5,5];
var newarr = splitInto(arr, 2);

inplace参数确定操作是否就地完成。

以下是演示:

function splitInto(array, size, inplace) {
    var output, i, group;

    if (inplace) {
        output = array;

        for (i = 0; i < array.length; i++) {
            group = array.splice(i, size);

            output.splice(i, 0, group);
        }
    } else {
        output = [];

        for (i = 0; i < array.length; i += size) {
            output.push(array.slice(i, size + i));
        }
    }

    return output;
}

var arr= [2,3,4,5,6,4,3,5,5];
var newarr = splitInto(arr, 2);

disp(newarr);

// or we can do it in-place...
splitInto(arr, 3, true);

disp(arr);

function disp(array) {  
  var json = JSON.stringify(array);

  var text = document.createTextNode(json);
  var pre = document.createElement('pre');

  pre.appendChild(text);
  document.body.appendChild(pre);
}

答案 9 :(得分:1)

常量项= [1,2,3,4,5];

const createBucket =(bucketItems,bucketSize)=> buckets => {   返回bucketItems.length === 0吗? buckets:[... buckets,bucketItems.splice(0,bucketSize)]; };

const bucketWithItems = items.reduce(createBucket([... items],4),[]);

答案 10 :(得分:1)

现在有了灵活的Array#flatMap(value, index, array)

const pairs = arr.flatMap((_, i, a) => i % 2 ? [] : [a.slice(i, i + 2)]);

可能更有效,但看起来很愚蠢的Array.from(source, mapfn?)

const pairs = Array.from({ length: arr.length / 2 }, (_, i) => arr.slice(i * 2, i * 2 + 2))

答案 11 :(得分:0)

这是一个简短且更通用的解决方案:

function splitArrayIntoPairs(arr, n) {
 var len = arr.length
  var pairs = []

  for (let i = 0; i < len; i += n) {
    var temp = []
    for (var j = i; j < (i + n); j++) {
      if (arr[j] !== undefined) {
        temp.push(arr[j])
      }
    }
    pairs.push(temp)
  }
  return pairs
}

arr 是您的数组,而 n 不是对

答案 12 :(得分:0)

这是另一个使用生成器函数的通用解决方案。

/**
 * Returns a `Generator` of all unique pairs of elements from the given `iterable`.
 * @param iterable The collection of which to find all unique element pairs.
 */
function* pairs(iterable) {
    const seenItems = new Set();
    for (const currentItem of iterable) {
        if (!seenItems.has(currentItem)) {
            for (const seenItem of seenItems) {
                yield [seenItem, currentItem];
            }
            seenItems.add(currentItem);
        }
    }
}

const numbers = [1, 2, 3, 2];
const pairsOfNumbers = pairs(numbers);

console.log(Array.from(pairsOfNumbers));
// [[1,2],[1,3],[2,3]]

我喜欢这种方法的地方是,直到真正需要它之后,它才会消耗输入中的下一项。如果您将生成器作为输入提供给它,这将特别方便,因为它将尊重其延迟执行。

答案 13 :(得分:0)

这结合了上面的一些答案,但没有Object.fromEntires。输出类似于使用minimist所获得的输出。

    const splitParameters = (args) => {
      const split = (arg) => (arg.includes("=") ? arg.split("=") : [arg]);
    
      return args.reduce((params, arg) => [...params, ...split(arg)], []);
    };
    
    const createPairs = (args) =>
      Array.from({ length: args.length / 2 }, (_, i) =>
        args.slice(i * 2, i * 2 + 2)
      );
    
    const createParameters = (pairs) =>
      pairs.reduce(
        (flags, value) => ({
          ...flags,
          ...{ [value[0].replace("--", "")]: value[1] }
        }),
        {}
      );
    
    const getCliParameters = (args) => {
      const pairs = createPairs(splitParameters(args));
      const paramaters = createParameters(pairs);
    
      console.log(paramaters);
    
      return paramaters;
    };
 

    //const argsFromNodeCli = process.argv.slice(2); // For node
      
    const testArgs = [
      "--url",
      "https://www.google.com",
      "--phrases=hello,hi,bye,ok"
    ];
    
    const output = getCliParameters(testArgs);
    document.body.innerText = JSON.stringify(output);