#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, который не работал. Однако, как только эти изменения были внесены, все заработало отлично, еще раз спасибо!