#javascript #arrays #object
#javascript #массивы #объект
Вопрос:
У меня есть следующая структура
const objArray = [ { shiftId: 89192 },
{ shiftId: 89193 },
{ shiftId: 89190 } ]
Массив объектов.
Я пытаюсь отобразить и извлечь значение shiftId
Что я делаю, object.map(el=> Object.values(el));
но это сопоставление возвращает следующую структуру, потому что Object.values
, к сожалению, возвращает массив.
[ [ 89192 ], [ 89193 ], [ 89190 ] ]
Вложенные массивы, содержащие только один элемент.
Как я могу сопоставить это, чтобы возвращать только массив.
Комментарии:
1. пожалуйста, добавьте допустимый формат данных.
Ответ №1:
Вы могли бы получить свойство из первого найденного значения.
var array = [{ anonymous: { shiftId: 89192 } }, { anonymous: { shiftId: 89193 } }, { anonymous: { shiftId: 89190 } }],
values = array.map(o => Object.values(o)[0].shiftId);
console.log(values);
Ответ №2:
Если вы хотите извлечь shiftId
свойство, просто укажите, что вы хотите извлечь это конкретное свойство, а не использовать Object.values
:
const shiftIds = object.map(({ shiftId }) => shiftId);
Обратите внимание, что у вас там есть массив — ваш код был бы более понятным, если бы вы вызывали переменную arrOfShiftObjs
или что-то в этом роде, а не вызывали ее object
.
Чтобы извлечь несколько значений из каждого элемента и поместить их в один больший массив, используйте flatMap
:
const arr = [{
shiftId: 89192,
id: 'id'
},
{
shiftId: 89193,
id: 'id'
},
{
shiftId: 89190,
id: 'id'
}
];
const values = arr.flatMap(Object.values);
console.log(values);
Или, если объекты также содержат другие свойства, которые вы не хотите включать, и вам нужны только shiftId
и id
:
const arr = [{
shiftId: 89192,
id: 'id'
},
{
shiftId: 89193,
id: 'id'
},
{
shiftId: 89190,
id: 'id'
}
];
const values = arr.flatMap(({ shiftId, id }) => [shiftId, id]);
console.log(values);
Как и при использовании всех более новых функций, если вы хотите поддерживать браузеры, в которых этого еще нет, используйте полизаполнение. Конечно, вы также могли бы reduce
вместо
const arr = [{
shiftId: 89192,
id: 'id'
},
{
shiftId: 89193,
id: 'id'
},
{
shiftId: 89190,
id: 'id'
}
];
const values = arr.reduce((a, { shiftId, id }) => {
a.push(shiftId, id);
return a;
}, []);
console.log(values);
Комментарии:
1. Спасибо! Это работает… но почему, вы можете объяснить? Как мы можем вернуть только значение, а не весь объект, например?
2.
Object.values
возвращает массив всех значений объекта в форме массива. Если в объекте есть только одна пара ключ-значение, он вернет массив, содержащий одно значение. Если вы.map
и обратный вызов возвращаете что-то изObject.values
, вы получите вложенный массив, как вы видите. Итак, просто не используйте,Object.values
если вы хотите извлечь только одно свойство из объекта — таким образом,.map
обратный вызов возвращает интересующее вас простое значение , а не массив. (вы также можете вернутьObject.values(el)[0]
, если вы заранее не знаете значение ключа)3. Что, если бы мы хотели сделать то же самое, но у объекта были shiftId и Id, и нам нужны были оба, что бы мы могли сделать в этом случае?
4. Каким был бы ваш желаемый результат в этом случае? Все еще только один массив, содержащий числа?
5. Да, допустим, обычный массив.
Ответ №3:
С использованием деструктурирования объекта и Array.prototype.map
let array = [{ anonymous: { shiftId: 89192 } }, { anonymous: { shiftId: 89193 } }, { anonymous: { shiftId: 89190 } }]
let out = array.map(({anonymous: {shiftId}}) => shiftId)
console.log(out)