Veneomin
@Veneomin

Как упростить массив?

Есть массив вида:
[
{name: 'Vasya'},
{name: 'Zina'},
{name: 'Vasya'},
{name: 'Vasya'},
{name: 'Petya'},
{name: 'Vasya'},
{name: 'Petya'},
{name: 'Vasya'},
]

Нужно чтобы имена не повторялись. Тоесть на выходе нужно:
[
{name: 'Vasya'},
{name: 'Zina'},
{name: 'Petya'},
]
  • Вопрос задан
  • 322 просмотра
Решения вопроса 2
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
var src = [
{name: 'Vasya'},
{name: 'Zina'},
{name: 'Vasya'},
{name: 'Vasya'},
{name: 'Petya'},
{name: 'Vasya'},
{name: 'Petya'},
{name: 'Vasya'},
];
    
var temp = [];
src.forEach(function(e){
    if(temp.indexOf(e.name) == -1){
        temp.push(e.name);
    }
});

src = temp.map(function(e){
    return {name:e};
});

console.log(src);
Ответ написан
miraage
@miraage
Старый прогер
var src = [
{name: 'Vasya'},
{name: 'Zina'},
{name: 'Vasya'},
{name: 'Vasya'},
{name: 'Petya'},
{name: 'Vasya'},
{name: 'Petya'},
{name: 'Vasya'},
];

var temp = {};
var result = [];

src.forEach(function(item) {
  var name = item.name;
  
  if (!temp[name]) {
    temp[name] = true;
    result.push(item);
  }
});

console.log(result);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
IonDen
@IonDen
JavaScript developer. IonDen.com
Для работы с коллекциями лучше всего подходит Lodash. На нем ваша задача решается элементарно:
jsfiddle.net/IonDen/y6pmns0o
var a = [
    {name: 'Vasya'},
    {name: 'Zina'},
    {name: 'Vasya'},
    {name: 'Vasya'},
    {name: 'Petya'},
    {name: 'Vasya'},
    {name: 'Petya'},
    {name: 'Vasya'}
];
    
var b = _.uniq(a, 'name');
console.log(b);
Ответ написан
Комментировать
@teslor
В подобных случаях обычно используют временный объект (у которого создаются свойства и потом проверяется их наличие, при этом что записывать в свойства - не важно), это работает очень быстро. Здесь mas - исходный массив, newmas - результат.

var obj = {},
    newmas = [],
    i, max;
for (i = 0, max = mas.length; i < max; i += 1) {
    if (!obj[mas[i].name]) {
        obj[mas[i].name] = true;
        newmas.push(mas[i]);
    }
}
Ответ написан
Комментировать
Пожалуй, наиболее корректен это способ:
var keys = {}, has = {}.hasOwnProperty;
src = src.filter(function(e){
  if(!has.call(keys, e.name))return keys[e.name] = true;
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы