js根据条件将一个一维对象数组转为二维数组

请问下,如何把下面的数组arrayFirst,根据相同的index转成arrayTwo

var arrayFirst = [{
    index: 1,
    datas: han
},
{
    index: 1,
    datas: hu
}, {
    index: 2,
    datas: zhang
},
{
    index: 2,
    datas: wang
}

]

var arrayTwo = [[{
    index: 1,
    datas: han
},
{
    index: 1,
    datas: hu
}], [{
    index: 2,
    datas: zhang
},
{
    index: 2,
    datas: wang
}]]

看着很简单,但是确不知道怎么做才好

阅读 13k
7 个回答
// 创建映射
var map = arrayFirst.reduce((p, c) => [p[c.index] = p[c.index] || [],
                                       p[c.index].push(c), p][2], {})
// 获取映射分类下的数组                                       
var result = Object.keys(map).map(i => map[i])

es6实现起来很简洁,es5就参见楼上吧

var arrayFirst = [
  {
    index: 1,
    datas: 'han'
  },
  {
    index: 1,
    datas: 'hu'
  }, {
    index: 2,
    datas: 'zhang'
  },
  {
    index: 2,
    datas: 'wang'
  }
];

var arrayTwo = Object.values(arrayFirst.reduce((res, item) => {
  res[item.index] ? res[item.index].push(item) : res[item.index] = [item];
  return res;
}, {}));

console.log(arrayTwo)

map方法 比较好理解:

            var map = new Map();
            var newArr = [];
            arrayFirst.forEach(function(item,i){
                map.has(item.index) ? map.get(item.index).push(item) : map.set(item.index,[item])
            })
            newArr = [...map.values()];
            
            console.log(newArr)
var arrayTwo = [];
var indexGroup = arrayFirst.map(v => v.index);
var flag = [];
for(var i = 0; i<indexGroup.length; i++) {
    var index = indexGroup[i];
    if(flag[index]) continue;
    flag[index] = 1;
    var groupArray = arrayFirst.filter(v => v.index === index);
    arrayTwo.push(groupArray);
}

先归类,再转数组

function convert (arr) {
    var map1 = {};
    while(arr.length) {
        let current = arr.pop(); // 会影响原数组
        map1[current.index] = map1[current.index] || [];
        map1[current.index].push(current);
    }
    
    return Object.keys(map1).map(key => map1[key]);
}

先按 index 把数组排个序,然后在利用 slice/splice 切数组, 切出来的组成新的二维数组

利用对象把 index 的值作为属性, 把对应的数组元素作为属性值数组的元素, 最后把对象的属性值组成新的二维数组

不一一回复了,大家的办法都特别好,把需求处理完,再挨个试大家的方案,再次谢谢所有回答和参与本问题的朋友!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏