Удаление дублирования Angular2 JSON

#arrays #json #angular

#массивы #json #угловой

Вопрос:

Я работаю с большим файлом JSON, содержащим информацию об инструкторах в моей школе. Я хочу иметь возможность извлекать имена всех учителей из этого списка, чтобы затем поместить их в Firebase. Однако всякий раз, когда я перебираю свой файл JSON и пытаюсь отфильтровать все повторяющиеся имена учителей, я все равно получаю дубликаты, даже когда пытаюсь выполнить второй раунд удаления. JSON выглядит следующим образом:

 {
"Id": "1",
…
"Instructor": "name1, name2, name3", 
…
},
{
"Id": "2",
…
"Instructor": "name1", 
…
},
{
"Id": "3",
…
"Instructor": "name1, name2", 
…
}
 

Как видно выше, иногда существует только одно имя, в других случаях их несколько. Я справляюсь с этим, хотя и в своей логике, но, несмотря ни на что, я все равно получаю дубликаты. Если кто-нибудь может помочь мне придумать способ решить эту проблему, я был бы очень признателен. Я добавлю свой код, который у меня уже есть ниже.

 public remove_duplicates(arr: any[]): any[] {
    let output: any[] = [];
    for (let i = 0; i < arr.length; i  ) {
      let instruc: any[] = arr[i].Instructor.split(',');
      for (let j = 0; j < instruc.length; j  ) {
        let push: boolean = true;
        arr[i].Instructor = instruc[j];
        for (let k = 0; k < output.length; k  ) {
          let i1: string = output[k].Instructor;
          let i2: string = arr[i].Instructor;
          if (i1.trim().localeCompare(i2.trim()) == 0) {
            push = false;
          }
        }
        if (push)
          output.push(arr[i]);
      }
    }

    console.log(output.length);
    for (let k = 0; k < output.length; k  ) {
      for (let i = k   1; i < output.length; i  ) {
        if (new String(output[i].Instructor).valueOf().trim()
          === new String(output[k].Instructor).valueOf().trim()) {
          output.splice(i, 1);
        }
      }
    }

    for (let k = 0; k < output.length; k  ) {
      console.log(output[k].Instructor);
    }

    console.log(output.length);
    return arr;
  }

  ngOnInit() {
    this.http.get('courses.json').take(1)
      .map((res: Response) => res.json())
      .subscribe(
      data => {
        this.list = data;
      },
      err => console.log(err),
      () => this.remove_duplicates(this.list)
      );
  }
 

Ответ №1:

В Angular 2 нет ничего специфичного, что вы пытаетесь сделать здесь. Это просто ванильный JS.

Попробуйте что-то вроде этого:

 public remove_duplicates(arr) {
    let seen = {};
    let uniqueInstructorNames = [];
    arr.forEach(function(item) {
        let instructorNames = item.Instructor.split(',');
        Array.prototype.push.apply(uniqueInstructorNames, instructorNames.filter( name => { 
            return seen.hasOwnProperty(item) ? false : (seen[item] = true);
        }));
    });
    return uniqueInstructorNames;
}
 

Комментарии:

1. Большое вам спасибо! Там было кое-что, что нужно было изменить, чтобы заставить его работать на 100%. Во-первых, я сделал так, чтобы он убрал все пробелы из элементов в instructorsNames. Затем вы ставите seen[item] = true , но его нужно было видеть [name] . То же самое для seen.hasOwnProperty(). Когда элемент был сохранен в seen, он сохранил весь объект JSON, который не работал. Однако, как только эти изменения были внесены, все заработало отлично, еще раз спасибо!