我怎么能按这样的值拆分数组:
[0, 1, 2, 0, 0, 0, 1, 0]
=>
[[0, 1, 2], [0], [0], [0, 1], [0]]
?
我正在使用lodash纪录片,但现在有点想法了。有没有办法用_.groupBy
执行此操作?
谢谢你的回答。
答案 0 :(得分:4)
使用原生JavaScrip Array#reduce
方法。
var data = [0, 1, 2, 0, 0, 0, 1, 0],
last;
var res = data.reduce(function(arr, v) {
// check the difference between last value and current
// value is 1
if (v - last == 1)
// if 1 then push the value into the last array element
arr[arr.length - 1].push(v)
else
// else push it as a new array element
arr.push([v]);
// update the last element value
last = v;
// return the array refernece
return arr;
// set initial value as empty array
}, [])
console.log(res);

答案 1 :(得分:1)
以下是ES2015(以前的ES6)中的简洁解决方案。
const newArray = [];
[0, 1, 2, 0, 0, 0, 1, 0].forEach(item => item === 0 ?
newArray.push([0]) :
newArray[newArray.length - 1].push(item)
);
console.log(newArray);
答案 2 :(得分:1)
您可以为每个找到的零值使用一个新数组,否则追加到结果集中的最后一个数组。
.single .nc_socialPanel:not(.nc_floater):not(.nc_socialPanelSide):hover{
filter:grayscale(0%);
}

var array = [0, 1, 2, 0, 0, 0, 1, 0],
result = array.reduce(function (r, a) {
if (a) {
r[r.length - 1].push(a);
} else {
r.push([a]);
}
return r;
}, []);
console.log(result);

答案 3 :(得分:1)
如果你遇到零时必须启动一个新阵列,你可以诉诸 这段代码,希望它不会像vodoo编程那样出现。
var x = [0, 1, 2, 0, 0, 0, 1, 0];
x.join("") /* convert the array to a string */
.match(/(0[^0]*)/g) /* use a regex to split the string
into sequences starting with a zero
and running until you encounter
another zero */
.map(x=>x.split("")) /* get back the array splitting the
string chars one by one */
我假设数组元素只是一个数字长,0是每个子数组的开始。
删除一位数的假设将使用此代码:
var x = [0, 1, 2, 0, 12, 0, 0, 1, 0];
var the_regexp = /0(,[1-9]\d*)*/g;
x.join(",") /* convert the array to a comma separated
string */
.match(the_regexp) /* this regex is slightly different from
the previous one (see the note) */
.map(x=>x.split(",")) /* recreate the array */
在这个解决方案中,我们用逗号分隔数组元素,让我们检查一下regEx:
/0
表示每个子数组都以0开头,/
是匹配的开头
,[1-9]\d*
如果前面有逗号,则此子模式匹配整数;第一个数字不能为0,其他可选数字不具有此限制。因此,我们匹配,1 或,200 或,9 或,549302387439209 。
我们必须在子数组中包含所有连续非零数字,我们找到(,[1-9]\d*)*
可能没有,因此第二个*
。
`/ g'关闭RegExp。 g表示我们想要所有匹配而不仅仅是第一个匹配。
如果您更喜欢oneliner:
x.join(",").match(/0(,[1-9]\d*)*/g).map(x=>x.split(','));
或者,如果您更喜欢ECMA2015之前的函数表达式语法:
x.join(",").match(/0(,[1-9]\d*)*/g).map(function(x){return x.split(',');});