Javascript 唯一JSON值数组

Javascript 唯一JSON值数组,javascript,Javascript,我试图根据键值的比较来获得一个唯一JSON数据数组 在本例中,我试图删除所有具有重复category值的对象 例如: var products = [ { category: 'fos', name: 'retek' }, { category: 'fos', name: 'item' }, { category: 'nyedva', name: 'blabla' }, { category: 'fos', name: 'gihi

我试图根据键值的比较来获得一个唯一JSON数据数组

在本例中,我试图删除所有具有重复
category
值的对象

例如:

 var products = [
        { category: 'fos', name: 'retek' },
        { category: 'fos', name: 'item' },
        { category: 'nyedva', name: 'blabla' },
        { category: 'fos', name: 'gihi' }
    ];

// array of hold unique values
var uniqueNames = [];

for(i = 0; i< products.length; i++){    
    if(uniqueNames.indexOf(products[i].category) === -1){
        uniqueNames.push(products[i]);        
    }        
}
var产品=[
{类别:'fos',名称:'retek'},
{类别:'fos',名称:'item'},
{类别:'nyedva',名称:'blabla'},
{类别:'fos',名称:'gihi'}
];
//保持唯一值的数组
var uniqueNames=[];
对于(i=0;i
我试图将没有重复类别值的任何对象推送到数组中。这里是现场直播

请帮忙

开关

for(i = 0; i< products.length; i++){    
    if(uniqueNames.indexOf(products[i].category) === -1){
        uniqueNames.push(products[i]);        
    }        
}

当我尝试这样做时,我通常将所有值作为键放入地图中,因为地图数据结构只允许唯一键。因此,对于这种情况:

var crops = [   { 
    id:     0023,
    crop:   "corn"
},
{
    id:     0034,
    crop:   "corn"
},
{
    id:     0222,
    crop:   "wheat"
}
 ];
var cropsMap = {};
for(var i = 0; i < crops.length; i++) {
   cropsMap[crops[i].crop] = true;
}
var uniqueCrops = Object.keys(cropsMap);
var-crops=[{
id:0023,
作物:“玉米”
},
{
id:0034,
作物:“玉米”
},
{
id:0222,
作物:“小麦”
}
];
var cropsMap={};
对于(变量i=0;i

如果你想查看的话,我做了一个测试。

有几种方法可以做到这一点,这是其中之一:遍历所有项目,并过滤掉我们已经添加到该类别中的项目。为此,我们使用一个对象来保留我们看到的类别和新类别,因此我们只过滤看到的类别:

lookup = [];    

for (var product, i = 0; product = products[i++];) {
   var cat = item.category;

   if (!(cat in lookup)) {
     lookup[cat] = 1;
     result.push(products[cat]);
   }
 }
var seen = {}

var unique = products.filter(function(item){
    if(seen.hasOwnProperty(item.category)){
        return false;
    }else{
        seen[item.category] = true;
        return true;
    }
})

console.log(unique); // only 2 objects

indexOf检查uniqueNames在数组中是否已经有该类别,但是当您推送整个对象而不是类别时,它将永远找不到它,并且总是将所有对象推送到array@Kyle所以uniqueNames应该只包含
{category:'fos',name:'retek'},{category:'nyedva',name:'blablabla'}
?@Moogs Yes,它应该只包含这两个对象,请考虑编辑你的答案,包括解释你的代码是如何工作的。
lookup = [];    

for (var product, i = 0; product = products[i++];) {
   var cat = item.category;

   if (!(cat in lookup)) {
     lookup[cat] = 1;
     result.push(products[cat]);
   }
 }
var seen = {}

var unique = products.filter(function(item){
    if(seen.hasOwnProperty(item.category)){
        return false;
    }else{
        seen[item.category] = true;
        return true;
    }
})

console.log(unique); // only 2 objects