2015-01-22 2 views
-1

EDITED !!Дубликаты в массиве объектов

У меня есть объект array:

Array 0:[{id:"a1" , code:"123" , name:"a"}, 
     {id: "a2", code: "222" , name: "a"}, 
      {id: "b1", code: "433", name: "b"}] 
Array 1:[{id:"a1" , code:"123" , name:"a"}, 
     {id: "b2", code: "211" , name: "b"}, 
      {id: "b1", code: "433", name: "b"}] 

Я хочу, чтобы получить массив объекта, который не имеет повторяющееся значение для «имя». и хранить его в другой array:

Result: 
Array 0:{id: "b1", code: "433", name:"b"} 
Array 1: {id:"a1" , code:"123" , name:"a"} 

Как я могу получить массив объекта, который не имеет повторяющееся значение для name? Все, что я нашел в каком-то потоке, это удалить дубликаты из массива и не получить массив без дубликата. Заранее спасибо!

+0

почему downvote? -_- –

ответ

1
function filterByName(array) { 
    var counts = {}; 

    array.forEach(function(obj) { 
     counts[obj.name] ? ++counts[obj.name] : (counts[obj.name] = 1); 
    }); 

    return array.filter(function(obj) { 
     return counts[obj.name] === 1; 
    }); 
} 

var filteredArray1 = filterByName(array1); 
var filteredArray2 = filterByName(array2); 

Объяснения функции

  1. Создать временный counts объект для хранения отсчетов объекта с таким же именем.
  2. Заполните этот объект данными с помощью стандартного метода массива forEach.
  3. массив фильтров с использованием стандартной filter метод

UPD Вам это нужно, если я правильно понимаю ваш вопрос наконец:

var filteredArray = arrayOfArrays.map(function(arrayOfObjects) { 
    return filterByName(arrayOfObjects)[0]; 
}); 
+0

вы можете объяснить этого сэра? –

+0

есть ошибка, указывающая «Недопустимая левая сторона в присваивании» для строки 'return! Temp [obj.name] && temp [obj.name] = true;' –

+0

@LewJasonNuyda: приоритет оператора. Используйте 'return! Temp [obj.name] && (temp [obj.name] = true); вместо этого. –

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