已知一个数组里面的内容,如何提取出相同的内容组成一个新的数组

目前已知一个数组,结构如下所示

    var list = [
        {
            cfi: "epubcfi(/6/8[chapter3])",
            href: "chapter3.html",
            id: "chapter3",
            label: "第 2 章 边城二",
            spinePos: 3,
            notes: {
                text: "河中水皆豆绿色,天气又那么明朗,鼓声蓬蓬响着,翠翠抿着嘴一句话不说",
                url: "epubcfi(/6/8[chapter3])"
            }
        },
        {
            cfi: "epubcfi(/6/8[chapter3])",
            href: "chapter3.html",
            id: "chapter3",
            label: "第 2 章 边城二",
            spinePos: 3,
            notes: {
                text: "人既醉倒后,无从入城,祖父为了责任又不便与渡船离开,留在河边的翠翠便不能不着急了",
                url: "epubcfi(/6/8[chapter3])"
            }
        },
        {
            cfi: "epubcfi(/6/18[chapter8])",
            href: "chapter8.html",
            id: "chapter8",
            label: "第 7 章 边城七",
            spinePos: 8,
            notes: {
                text: "照例如俗话说的,“狗离不得屋”,这些狗一离了自己的家,即或傍着主人,也变得非常老实了。",
                url: "epubcfi(/6/18[chapter8])"
            }
        },
        {
            cfi: "epubcfi(/6/18[chapter14])",
            href: "chapter14.html",
            id: "chapter14",
            label: "第 13 章 边城一三",
            spinePos: 14,
            notes: {
                text: "“我要坐船下桃源县过洞庭湖,让爷爷满城打锣去叫我,点了灯笼火把去找我。”",
                url: "epubcfi(/6/18[chapter14])"
            }
        }
    ];
    

数组中,包含多个相同的内容,现在想要把上面的数组转化成下面这样

var list = [
    {
        title: "第 2 章 边城二",
        num: 2,
        noteList: [
            {
                url: epubcfi(/6/8[chapter3]),
                text: '河中水皆豆绿色,天气又那么明朗,鼓声蓬蓬响着,翠翠抿着嘴一句话不说'
            },
            {
                url: epubcfi(/6/8[chapter3]),
                text: "人既醉倒后,无从入城,祖父为了责任又不便与渡船离开,留在河边的翠翠便不能不着急了"
            }
        ]
    },
    {    
        title: "第 7 章 边城七",
        num: 1,
        noteList: [
            {
                url: "epubcfi(/6/18[chapter8])",
                text: "照例如俗话说的,“狗离不得屋”,这些狗一离了自己的家,即或傍着主人,也变得非常老实了。"                
            }
        ]
    },
    {
        title: "第 13 章 边城一三",
        num: 1,
        noteList: [
            {
                url: "epubcfi(/6/18[chapter14])",
                text: "“我要坐船下桃源县过洞庭湖,让爷爷满城打锣去叫我,点了灯笼火把去找我。”"
            }
        ]
    }
];        

最终展示的结果就是像下面这样了。
其实就是有N个相同的标题,但是text不同的数组,现在想要整合成下面这样的,求助各位
非常感谢!

可能有人觉得这样的问题真的是so easy,但是对于有些人来说,这样的问题,其实在工作中是会遇到的,只是我之前没有遇到过,所以不知道该怎么处理。
说实话,如果自己能写出来,干嘛还要来网站上面求助呢?
并不是任何人都喜欢做伸手党的,我也不喜欢。
愿意回答的,我感激不尽,不愿意回答的,我也谢谢大家!
(上面的话有些偏激了,对不住大家)

阅读 8k
3 个回答
var  newList = [];
list.forEach(function(data){
  for(var i=0;i<newList.length;i++){
    if(newList[i].title === data.label){
      newList[i].nodeList.push(data.notes);
      newList[i].num++;
      return;
    }
  }
    newList.push({
      title:data.label,
      num:1,
      nodeList:[data.notes]
    });
});
console.log(newList);

循环便利数组里面的对象,把要的东西拿出来,生成新的对象,组成数组嘛。

var dataFilter = function(data){
  var obj = {}, arr = [];
  console.time('test');
  for(var i = 0, len = data.length; i < len ; i++){
   var currentData = data[i],
       currentKey = currentData.cfi,
       hased = currentKey in obj;   
   obj[currentKey] = {
      title : currentData.label,
      num : hased ? ++obj[currentKey]['num'] : 1,
      noteList :  (hased ? obj[currentKey]['noteList'] : []).concat(currentData.notes)
   }   
}
  for(var key in obj){
    arr.push(obj[key]);
  }
  console.timeEnd('test');
  return arr;
}

原理就是利用object的key值一样时会覆盖,key一样时让num自增。

一般情况下,速度肯定比嵌套for循环快。

看下可以用不,简单的测试了下,不知道有没bug。--

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