基于值的数组拆分

时间:2017-06-22 17:19:03

标签: javascript lodash

我怎么能按这样的值拆分数组:

[0, 1, 2, 0, 0, 0, 1, 0] =>  [[0, 1, 2], [0], [0], [0, 1], [0]]

我正在使用lodash纪录片,但现在有点想法了。有没有办法用_.groupBy执行此操作? 谢谢你的回答。

4 个答案:

答案 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(',');});