2016-09-28 7 views
0
var arr = [ 
    {level:0,name:"greg"}, 
    {level:0,name:"Math"}, 
    {level:0,name:"greg"} 
]; 

Я попробовал следующее:Как удалить повторяющиеся имена из массива объектов

function removeDuplicates:(dataObject){ 
    self.dataObjectArr = Object.keys(dataObject).map(function(key){ 
     return dataObject[key]; 
    }); 

    for(var i= 0; i < self.dataObjectArr.length; i++){ 
     self.dataObjectArr[i]['name'] = self.dataObjectArr[i]; 

     self.uniqArr = new Array(); 
     for(var key in self.dataObjectArr){ 
      self.uniqArr.push(self.dataObjectArr[key]); 
     } 
    } 
    self.uniqObject = DataMixin.toObject(self.uniqArr); 
    return self.uniqObject; 
} 

Но я получаю ошибку говоря: неперехваченный TypeError: Преобразование круговой структуры JSON.

+1

Должен ли 'Math' быть' 'Math''? – guest271314

+0

Кажется, у вашей функции есть функция ':' here -> 'removeDuplicates: (dataObject)'? –

+0

Вы можете использовать 'underscore' проверить этот ответ http://stackoverflow.com/questions/9923890/removing-duplicate-objects-with-underscore-for-javascript – Davide

ответ

2

Вы должны нажать name на массив или набор и проверить то же самое в следующем ..

var arr = [{ 
 
    level: 0, 
 
    name: "greg" 
 
}, { 
 
    level: 0, 
 
    name: "Math" 
 
}, { 
 
    level: 0, 
 
    name: "greg" 
 
}] 
 

 
function removeDuplicates(arr) { 
 
    var temp = [] 
 
    return arr.filter(function(el) { 
 
    if (temp.indexOf(el.name) < 0) { 
 
     temp.push(el.name) 
 
     return true 
 
    } 
 
    }) 
 
} 
 

 
console.log(removeDuplicates(arr))

+0

Это хорошее решение для ES5, где у вас нет 'Set'. – georg

+0

Что такое 'temp.indexOf (el.name) <0' делать? – Satyadev

+0

менее 0 означает -1 (не найдено) ?? Не могли бы вы объяснить, – Satyadev

2

Вот общий "uniquify" функция:

function uniqBy(a, key) { 
 
    var seen = new Set(); 
 
    return a.filter(item => { 
 
     var k = key(item); 
 
     return !seen.has(k) && seen.add(k) 
 
    }); 
 
} 
 

 
/// 
 

 
var arr = [ 
 
    {level:0,name:"greg"}, 
 
    {level:0,name:"greg"}, 
 
    {level:0,name:"joe"}, 
 
    {level:0,name:Math}, 
 
    {level:0,name:"greg"}, 
 
    {level:0,name:"greg"}, 
 
    {level:0,name:Math}, 
 
    {level:0,name:"greg"} 
 
]; 
 

 
uniq = uniqBy(arr, x => x.name); 
 
console.log(uniq);

См here для углубленного обсуждения.

0

Я считаю, что у вас есть ошибка синтаксиса "removeDuplicates: (DataObject) {... "

должен быть без ":" >> "removeDuplicates (DataObject) {..." "

Вы можете попробовать это:

function removeDuplicates(arr){ 
    var match={}, newArr=[]; 
    for(var i in arr){ if(!match[arr[i].name]){ match[arr[i].name]=1; var newArr=i; } } 
    return newArr; 
} 

arr = removeDuplicates(arr); 
0

Вы можете использовать $.unique(), $.map(), $.grep()

var arr = [ 
    {level:0,name:"greg"}, 
    {level:0,name:"Math"}, 
    {level:0,name:"greg"} 
]; 

var res = $.map($.unique($.map(arr, el => el.name)), name => 
      $.grep(arr, el => el.name === name)[0]); 

jsfiddle https://jsfiddle.net/4tex8xhy/3

0

Или вы можете использовать такие библиотеки, как подчеркивание или lodash (https://lodash.com/docs/4.16.2). Пример Лодэша:

var arr = [ 
    {level:0,name:"greg"}, 
    {level:0,name:"Math"}, 
    {level:0,name:"greg"} 
]; 

var result = _.map(_.keyBy(arr,'name')); 

//result will contain 
//[ 
// { 
// "level": 0, 
// "name": "greg" 
// }, 
// { 
// "level": 0, 
// "name": "Math" 
// } 
//] 

0Наз. одна вещь, которую нужно всегда учитывать в этих задачах, что вы хотите точно, вы собираетесь сделать: изменить существующий массив или получить новый. Этот пример возвращает вам новый массив.

Смежные вопросы