将对象数组转换为数组数组(按属性)

时间:2019-01-10 12:17:47

标签: javascript arrays object ecmascript-6 reduce

我想通过属性“ icon”将我的数组转换为数组。

const array = [
  { icon: true }, 
  { icon: false },
  { icon: false }, 
  { icon: true }, 
  { icon: false }
]

我需要:

[[{icon: true}, {icon: false}, {icon: false}], [{{icon: true}, {icon: false}}]]

属性icon === true是新数组形成开始的标志。

我认为您应该使用reduce函数。

array.reduce((result, item, index) => { ... }, [])

如何最好地编写一个转换?谢谢!

4 个答案:

答案 0 :(得分:4)

您可以使用.reduce()方法,如下所示:

const data = [{ icon: true }, { icon: false }, { icon: false }, { icon: true }, { icon: false }]

const result = data.reduce((r, c) => {
  if(c.icon === true)
    r.push([c]);
  else
    r[Math.max(r.length - 1, 0)].push(c);
    
  return r;
},[]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您可以使用while 循环

const array = [{ icon: true }, { icon: false }, { icon: false }, { icon: true }, { icon: false }]
i = 0;
result = [];
aux = [];
while(i <  array.length){
   if(array[i].icon){
     if(aux.length !== 0){
        result.push(aux);
        aux = [array[i]];
     }
     else
        aux.push(array[i]);
   }
   else
     aux.push(array[i]);
   i++;
}
result.push(aux);
console.log(result);

答案 2 :(得分:0)

您可以在数组上使用闭包进行插入。这样可以防止查找数组中的最后一项。

const
    data = [{ icon: true }, { icon: false }, { icon: false }, { icon: true }, { icon: false }],
    result = data.reduce((a => (r, o) => {
        if (o.icon) r.push(a = []);
        a.push(o);
        return r;
    })(), []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:0)

const array = [
  { icon: true },
  { icon: false },
  { icon: false },
  { icon: true },
  { icon: false }
];

console.log(grouper(array));

function grouper(array) {
  return array.reduce((acc, next) => {
    const entry = [next];

    if (next.icon) return acc.concat([entry]);
    const beforeNextCollection = acc.slice(0, acc.length - 1);

    const nextCollection = acc[acc.length - 1];
    const updatedCollection = nextCollection.concat(entry);

    return beforeNextCollection.concat([updatedCollection]);
  }, []);
}