У меня есть массив с адресами учеников и родителей.
Например,
const users = [{
id: 1,
name: 'John',
email: 'johnson@mail.com',
age: 25,
parent_address: 'USA',
relationship:'mother'
},
{
id: 1,
name: 'John',
email: 'johnson@mail.com',
age: 25,
parent_address: 'Spain',
relationship:'father'
},
{
id: 2,
name: 'Mark',
email: 'mark@mail.com',
age: 28,
parent_address: 'France',
relationship:'father'
}
];
Я пытаюсь переформатировать это до следующего результата.
const list = [
{
id: 1,
name: 'John',
email: 'johnson@mail.com',
age: 25,
parent: [
{
parent_address: 'USA',
relationship:'mother'
},{
parent_address: 'Spain',
relationship:'father'
}
]
},
{
id: 2,
name: 'Mark',
email: 'mark@mail.com',
age: 28,
parent:[
{
parent_address: 'France',
relationship:'father'
}
]
}
];
Пока что я попробовал следующий способ. Я не уверен, что это правильный путь или нет.
const duplicateInfo = [];
for (var i = 0; i < user[0].length; i++) {
var parent = [];
if (duplicateInfo.indexOf(user[0][i].id) != -1) {
// Do duplicate stuff
} else {
// Do other
}
duplicateInfo.push(user[0][i].id);
}
javascript
arrays
Kathy
источник
источник
parent_address
иrelationship
в кparent
объекту, и объединить их , когда повторяющееся имя и адрес электронной почты найдены.const list = []
Сначала вы говорите , но внизу вы перебираете этот список, очевидно, перебираяuser[0]
. Ваш пример кода должен быть последовательным.Ответы:
Одним из подходов было бы использование
.reduce()
объекта в качестве аккумулятора. Для каждого идентификатора вы можете сохранить связанный объект с родительским массивом, который вы можете добавить в.reduce()
обратный вызов всякий раз, когда встречаете новый объект с таким же идентификатором. Затем, чтобы получить массив объектов из вашего объекта, вы можете вызватьObject.values()
егоСмотрите пример ниже:
Поскольку вы упомянули, что вы новичок в JS, это может быть проще для понимания более императивным способом (подробности см. В комментариях к коду):
источник
reduce
обратном вызове хороша, но может быть немного тяжелой для новичка.Вы можете уменьшить массив и найти пользователя с тем же идентификатором и добавить к нему информацию о родителе.
Если пользователь не найден, добавьте нового пользователя в набор результатов.
источник
Такая реструктуризация данных довольно распространена и
Array.reduce()
предназначена для этой задачи. Это другой способ просмотра вещей, к которому нужно привыкнуть, но после того, как вы несколько раз напишите код, он станет второй натурой.reduce()
вызывается в массиве и принимает два параметра:Затем ваша функция вызывается для каждого элемента с начальным значением для первого запуска или возвращаемым значением из предыдущего вызова функции для каждого последующего запуска, по элементу массива, индексом в исходный массив и исходным массивом lower () был вызван (последние два обычно игнорируются и редко нужны). Он должен возвращать объект или все, что вы создаете, с добавлением текущего элемента, и это возвращаемое значение передается при следующем вызове вашей функции.
Для подобных вещей у меня обычно есть объект для хранения уникальных ключей (
id
для вас), но я вижу, что вы хотите вернуть массив. Это одна строка для сопоставления объекта и ключей с массивом, и более эффективно использовать встроенный механизм свойств объекта вместо array.find (), чтобы увидеть, добавили ли вы уже идентификатор.источник
Вам нужно повторить дважды, используя текущий метод. Сложность O (n ^ 2). (для цикла + indexOf)
Лучший способ - индексировать массив и использовать ключ массива для обнаружения дублирования и поиска.
Например:
источник
источник
Вы можете использовать
Map
коллекцию для хранения уникальных предметов и просто заполнить их, используяfilter
:источник
источник