Javascript 如何在数组和合并相似项中找到相似值(数字)?

Javascript 如何在数组和合并相似项中找到相似值(数字)?,javascript,array-merge,Javascript,Array Merge,我有一个样本数组,我想在数组中找到重复的(类似的)数字,然后合并 var arr = [{ 'title': 'abc', 'number': 1 },{ 'title': 'def', 'number': 1 },{ 'title': 'ghi', 'number': 2 }]; 然后合并一定是这样的 var arr = [{ 'title': ['abc', 'def'], 'number': 1 },{ 'title': 'ghi', 'number': 2 }]; 我的意思是必须将d

我有一个样本数组,我想在数组中找到重复的(类似的)数字,然后合并

var arr = [{
'title': 'abc',
'number': 1
},{
'title': 'def',
'number': 1
},{
'title': 'ghi',
'number': 2
}];
然后合并一定是这样的

var arr = [{
'title': ['abc', 'def'],
'number': 1
},{
'title': 'ghi',
'number': 2
}];

我的意思是必须将duplicate的标题合并为一个标题,并且必须删除duplicate。

最简单的方法之一是使用唯一键将数据还原为一个对象,以捕获常见的数据:

var obj = arr.reduce(function (p, c) {
  var key = c.number;

  // if the object doesn't exist, create a new one
  // and set it's value as a pre-filled object
  p[key] = p[key] || { title: [], number: key };

  // then add the title to the title array
  p[key].title.push(c.title);
  return p;
}, {});
然后使用对象键上的
map
重新创建对象数组:

var data = Object.keys(obj).map(function (el) {
  return { title: obj[el].title, number: el };
});

这将为标题提供一个数组,不管其中有多少元素,这是正确的方法(请参阅@thefourtheye的注释)

但是,如果只希望在标题数组中有两个或更多元素时才有一个数组,则可以稍微更改代码:

var data = Object.keys(obj).map(function (el) {
  var title = obj[el].title;
  return {
    title: title.length === 1 ? title[0] : title,
    number: el
  };
});

最简单的方法之一是使用唯一键捕获常见数据,将数据简化为对象:

var obj = arr.reduce(function (p, c) {
  var key = c.number;

  // if the object doesn't exist, create a new one
  // and set it's value as a pre-filled object
  p[key] = p[key] || { title: [], number: key };

  // then add the title to the title array
  p[key].title.push(c.title);
  return p;
}, {});
然后使用对象键上的
map
重新创建对象数组:

var data = Object.keys(obj).map(function (el) {
  return { title: obj[el].title, number: el };
});

这将为标题提供一个数组,不管其中有多少元素,这是正确的方法(请参阅@thefourtheye的注释)

但是,如果只希望在标题数组中有两个或更多元素时才有一个数组,则可以稍微更改代码:

var data = Object.keys(obj).map(function (el) {
  var title = obj[el].title;
  return {
    title: title.length === 1 ? title[0] : title,
    number: el
  };
});

这是一种使用临时对象的方法,该对象保存对数组和结果数组本身的引用

具有相同编号的重复的
标题
仅插入一次(如
{'title':'xxx','number':42}

var arr=[{'title':'xxx','number':42},{'title':'xxx','number':42},{'title':'abc','number':1},{'title':'def','number':1},{'title':'ghi','number':2},
结果=arr.REDUCT(功能(r,b){
如果(r.o.中的b.编号){
如果(!(r.o.中的b.标题[b.编号]){
r、 a[r.o[b.number].index].title.push(b.title);
r、 o[b.编号][b.头衔]=正确;
}
返回r;
}
r、 o[b.number]={index:r.a.push({title:[b.title],number:b.number})-1};
r、 o[b.编号][b.头衔]=正确;
返回r;
},{o:{},a:[]});

document.write(“”+JSON.stringify(结果,0,4)+“”)这是一种使用临时对象的方法,该对象保存对数组和结果数组本身的引用

具有相同编号的重复的
标题
仅插入一次(如
{'title':'xxx','number':42}

var arr=[{'title':'xxx','number':42},{'title':'xxx','number':42},{'title':'abc','number':1},{'title':'def','number':1},{'title':'ghi','number':2},
结果=arr.REDUCT(功能(r,b){
如果(r.o.中的b.编号){
如果(!(r.o.中的b.标题[b.编号]){
r、 a[r.o[b.number].index].title.push(b.title);
r、 o[b.编号][b.头衔]=正确;
}
返回r;
}
r、 o[b.number]={index:r.a.push({title:[b.title],number:b.number})-1};
r、 o[b.编号][b.头衔]=正确;
返回r;
},{o:{},a:[]});

document.write(“”+JSON.stringify(结果,0,4)+“”)此解决方案在元素之间循环,并过滤出具有相同编号的第二个和后续元素,但在此之前,将其标题添加到第一个匹配项中。换句话说,它几乎完全遵循您提出的“算法”,以

我的意思是副本的标题必须合并成一个,副本必须删除

其中
findIndex
为(如果可用,也可以使用
Array#findIndex
):


这避免了必须创建其他类似对象的数据表示,然后再转换回数组格式。

此解决方案在元素之间循环,并过滤出第二个和后续具有相同编号的元素,但在执行此操作之前,会将其标题添加到第一个引用中。换句话说,它几乎完全遵循您提出的“算法”,以

我的意思是副本的标题必须合并成一个,副本必须删除

其中
findIndex
为(如果可用,也可以使用
Array#findIndex
):


这样可以避免创建其他类似对象的数据表示,然后再转换回数组格式。

不建议为特定字段使用两种不同的类型。不建议为特定字段使用两种不同的类型。JSFIDLE中的console字段在哪里?:D I未找到JSFIDLE使用浏览器控制台-F12打开。JSFIDLE中的控制台字段在哪里DI没有发现DJSFIDLE使用浏览器控制台-F12打开。您可以在默认情况下编写此代码吗?我什么都不懂,结果呢?我打开控制台但没有显示:(我在哪里可以看到结果?有机会时我会竖起一把小提琴。你能在默认情况下编写此代码吗?我什么都不懂。)结果在哪里?我打开控制台但没有显示:(我在哪里可以看到结果?有机会时我会竖起一把小提琴。