我想将一个数组拆分成数组对。
var arr = [2, 3, 4, 5, 6, 4, 3, 5, 5]
将会是
var newarr = [
[2, 3],
[4, 5],
[6, 4],
[3, 5],
[5]
]
我想将一个数组拆分成数组对。
var arr = [2, 3, 4, 5, 6, 4, 3, 5, 5]
将会是
var newarr = [
[2, 3],
[4, 5],
[6, 4],
[3, 5],
[5]
]
你可以使用js reduce
initialArray.reduce(function(result, value, index, array) {
if (index % 2 === 0)
result.push(array.slice(index, index + 2));
return result;
}, []);
array.reduce((result, value, index, sourceArray) => index % 2 === 0 ? [...result, sourceArray.slice(index, index + 2)] : result, [])
- mkbctrlLodash有一个处理这种情况的方法: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]]
没有预设的函数可以完成这个任务,但是这里有一个简单的解决方案:
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;
};
for(var i = 0; i < arr.length; i + 2)
导致进入了无限循环。由于i + 2
并没有设置i
的值,所以索引值没有更新。而使用i += 2
可以设置i
的值。这就是为什么尽可能地使用map/reduce函数式编程更好的原因! - larrydalmeida这是另一篇有点混合了已经发布的答案。我添加它是因为阅读了这些答案后,我仍然觉得可以让读者更容易理解:
var groups = [];
for(var i = 0; i < arr.length; i += 2)
{
groups.push(arr.slice(i, i + 2));
}
现在有了灵活的 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))
flatMap()
不仅是一种灵活的方式,而且是符合当今标准的最佳实践,应被视为最佳答案。 - ed1nh0可以在不使用库的情况下,将数组分成一对/块:
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]]
这里有一个很好的通用解决方案:
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);
}
与使用 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>');
_.reduce
的解决方案:var newArr = _(arr).reduce(function(result, value, index) {
if (index % 2 === 0)
result.push(arr.slice(index, index + 2));
return result;
}, []);
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]]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.min.js"></script>
reduce()
函数而不是直接使用chunk()
函数(参见https://dev59.com/Ql0Z5IYBdhLWcg3whQsj#51264923)? - YetAnotherFrank这里是使用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>