通过合并具有相同字段值的元素,获得卑鄙数组的唯一元素
Get unique elements of an abject array by merging elements with same value of field
有一个包含一些对象的数组,这些对象可能具有相同标题(不同类型)的元素。应该合并这些元素以获得具有唯一标题的结果数组,但单个对象的信息不应该丢失。
所以这个。。。
array = [
{ id: 1, title: 'one', type: 'infos' },
{ id: 2, title: 'two', type: 'infos' },
{ id: 3, title: 'same', type: 'infos' }, // <--
{ id: 1, title: 'oneDiff', type: 'article' },
{ id: 2, title: 'same', type: 'article' },
{ id: 3, title: 'three', type: 'article' } // <--
]
应该得到:
distinct = [
{ id: 1, title: 'one', type: 'infos' },
{ id: 2, title: 'two', type: 'infos' },
{ id: 1, title: 'oneDiff', type: 'article' },
{ id: 3, title: 'three', type: 'article' },
{ id: [{ id: 3, type: 'infos'}, { id: 2, type: 'article'}], title: 'same', type: 'multiple' }
]
我试着从这个开始,但我没能得到我需要的结果:
var unique = {};
var distinct = [];
for( var i in array ){
if( typeof(unique[array[i].title]) == "undefined"){
distinct.push(array[i].title);
}
unique[array[i].title] = 0;
}
我试着用array.reduce来做。所以如果你不支持ie8,你可以使用它。有一点需要注意:如果没有额外的数组,我无法做到这一点。
var tempArray = [];
var result = array.reduce(function (memo, element) {
var index = tempArray.indexOf(element.title);
if (index === -1) {
tempArray.push(element.title);
memo.push(element);
} else {
if (typeof memo[index].id === 'number') {
memo[index].id = [{
id: memo[index].id,
type: memo[index].type
}];
memo[index].type = 'multiple';
}
memo[index].id.push({
id: element.id,
type: element.type
});
tempArray.push(null);
}
return memo;
}, []);
jsbin 的示例
我有一个快速的想法。为什么不将标题和类型连接在一起,并将它们放在一个数组中呢?所以如果你有
title: 'apple'
type: 'golden'
然后你会把它们和下划线连在一起,得到
apple_golden
当然,只有在任何标题或类型中都没有下划线的情况下,这才有效。如果你这样做了,你可以制作一个独特的字符组合,象征着一个新词的开始。
例如:
apple!-!-!golden
相关文章:
- 为dropdownlistfor(MVC)中的每个元素设置唯一id
- 如何为动态创建的元素分配唯一的id-Javascript
- 根据对多个数组唯一的元素创建一个新数组
- 如何使用Protractor在AngularJS中唯一识别类似元素
- 唯一标识父类的元素
- 如何从字符串数组中获得8个随机唯一元素
- 在Java中从ArrayList中导入唯一元素
- 使用jQuery隐藏具有非唯一属性的元素
- 如何从自动增长到POST的列表中获取所有唯一元素
- 如何使用jQuery唯一地识别具有相同id的类似动态元素
- 向不同的数组元素添加唯一的 css
- 向数组添加唯一元素
- 克隆并附加唯一 ID 后找不到 DOM 元素
- Lodash Javascript 基于唯一属性值返回元素
- Javascript - 将唯一的元素 id 添加到具有相同类名的多个元素
- 克隆元素,但它们必须具有“唯一属性”
- 未捕获的异常:每个数据元素都必须实现一个唯一的“id”属性slick.dataview.js
- 如何通过Firebase数据库中的AngularJS在点击时获取数组元素的唯一ID
- 从嵌套数组中获取唯一元素的 JS 模式是什么
- nextAll() 可以跳过任何指定的父元素并在父元素中查找唯一的子元素