2017-09-03 79 views
0
var place =[ 
{city: "Durham, NC, United States", begin: "09/04/2017", id: 0}, 
{city: "Raleigh, NC, United States", begin: "09/11/2017", id: 1}, 
{city: "Durham, NC, United States", begin: "09/25/2017", id: 2}, 
{city: "Durham, NC, United States", begin: "09/25/2017", id: 3} 
] 

从上面我想创建一个新的数组,其中包含具有唯一城市/开始属性组合的对象。因此,就上述数组而言,结果将仅包含前3个对象,因为对象3和4包含相同的city/begin属性。如何过滤具有属性的唯一组合的对象

我已经尝试了/ if以及其他数组方法的各种组合,但没有成功,所以任何建议,将不胜感激。

回答

0

您可以在这里使用地图。 地图中的键为city,值为begin的数组。然后,您可以使用此地图过滤出重复项。

var map = new Map; 
var len = place.length; 
var newArr = []; 
for(i = 0; i < len; i++){ 
var obj = place[i]; 
if(map[obj.city] === undefined || map[obj.city] === null){ 
    map[obj.city] = []; 
    map[obj.city].push(obj.begin); 
    newArr.push(obj); 
}else if(!map[obj.city].includes(obj.begin)){ 
    map[obj.city].push(obj.begin); 
    newArr.push(obj); 
} 
} 
+0

谢谢 - 该解决方案是完美的 - 这样我就可以从过滤newArr对象工作。 – mac

0

使用下划线库中的一个简单的解决方案:

var list = [ 
    { city: 'Durham, NC, United States', begin: '09/04/2017', id: 0 }, 
    { city: 'Raleigh, NC, United States', begin: '09/11/2017', id: 1 }, 
    { city: 'Durham, NC, United States', begin: '09/25/2017', id: 2 }, 
    { city: 'Durham, NC, United States', begin: '09/25/2017', id: 3 }, 
]; 

var uniqueList = _.uniq(list, function(v) { 
return v.x && v.y; 
}); 

console.log(uniqueList); 
+0

谢谢 - 在此之前我还没有听说过下划线 - – mac

+0

不用担心,它来自underscore.js库或者您可以使用lodash库。 –

0

您可以使用array#reducearray#some。您可以将所有唯一值存储在一个新对象中,并用它来检查新对象是否是唯一的或是否与早期对象重复。

var places =[{city: "Durham, NC, United States", begin: "09/04/2017", id: 0},{city: "Raleigh, NC, United States", begin: "09/11/2017", id: 1},{city: "Durham, NC, United States", begin: "09/25/2017", id: 2}, {city: "Durham, NC, United States", begin: "09/25/2017", id: 3}]; 
 

 
var uniquePlaces = places.reduce((hash, obj) => { 
 
    let isExist = Object.values(hash).some(v => v.city === obj.city && v.begin === obj.begin); 
 
    return !isExist ? Object.assign(hash, {[obj.id] : obj}) : hash; 
 
}, Object.create(null)); 
 

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

相关问题