Я хотел скопировать выбранные свойства из одного object
в другой на основе условия (key
).
//Код
var abc = [{"name":"John", "age":30, "state":"WS", "id": 1}, {"name":"Wille", "age":36, "state":"SFO", "id": 2}, {"name":"Rack", "age":18, "state":"NJ", "id": 3}]
var xyz = [{"weight":69, "height":180, "mobile":4457158, "id": 1}, {"weight":77, "height":178, "mobile":5896854, "id": 2}, {"weight":56, "height":140, "mobile":568574, "id": 3}]
Я хотел скопировать только свойства (height
, mobile
) из xyz
в abc
.
Я попытался,
const result = abc.map(x=> ({...x, ...xyz.find(y=> y.id === x.id)}));
Даже в приведенном выше я не мог скопировать все свойства. Что пошло не так и как я могу скопировать выбранный?
Я вижу, что вы пытаетесь скопировать весь объект, можете ли вы правильно изложить свою проблему.
@code Да, я сначала попытался скопировать все, с чем я мог попытаться отфильтровать выбранное, но даже это не сработало. Моя конечная цель - скопировать выбранное.
попробуйте const result = abc.map(x =>{ let y=xyz.find(y => y.id === x.id) if (y){ let {weight,height}=y; return {.. .x,вес,рост} } return {...x} })
@JohnLobo Чего-то не хватает перед if?
@ACoder нет. я так не думаю
@JohnLobo Произошла ошибка компилятора, может быть запятая ожидается до или после, если
попробуйте добавить запятую, const result = abc.map(x =>{ let y=xyz.find(y => y.id === x.id); if (y){ let {weight,height}=y; return {...x,weight,height}; } return {...x}; }), а также форматировать код при вставке
Машинопись без машинописного текста?
Ваш код работает в js, но в машинописном тексте find может вернуть неопределенное значение, что означает, что результирующий массив будет иметь, возможно, неопределенные свойства.
interface Person = {
id: number;
state: string;
name: string;
age: number;
};
interface Stats = {
id: number;
weight: number;
height: number;
mobile: number;
};
interface Merged extends Person, Stats {}
Рассмотрите возможность использования find() as Stats
, если вы знаете, что массивы содержат данные, или хотите игнорировать тот факт, что идентификатор может быть не найден.
Возможно, просто сделайте это по шагам:
const result = abc.map((x) => {
const { height, mobile } = xyz.find((y) => y.id === x.id) || {};
return { ...x, height, mobile };
});
Спасибо за четкое понимание и решение, а не просто вопросы.
Один лайнер и ради круглых скобок вы можете создать IIFE, обертывающий объект:
abc.map(x => ({ ...x, ...(({ mobile, height }) => ({ mobile, height }))(xyz.find(y => x.id === y.id)) }));
По сути, мы распространяем x
, что вы уже делаете, затем распространяем IIFE с деструктурированными параметрами, чтобы возвращать только те данные, которые нам нужны, передавая наши find()
результаты в качестве аргументов.
var abc = [{
"name": "John",
"age": 30,
"state": "WS",
"id": 1
}, {
"name": "Wille",
"age": 36,
"state": "SFO",
"id": 2
}, {
"name": "Rack",
"age": 18,
"state": "NJ",
"id": 3
}];
var xyz = [{
"weight": 69,
"height": 180,
"mobile": 4457158,
"id": 1
}, {
"weight": 77,
"height": 178,
"mobile": 5896854,
"id": 2
}, {
"weight": 56,
"height": 140,
"mobile": 568574,
"id": 3
}];
function copy(from, to, keys) {
const mapped = from.reduce((acc, el) => {
return { ...acc,
[el.id]: el
}
}, {});
return to.map(el => {
const extracted = keys.reduce((acc, k) => ({ ...acc,
[k]: mapped[el.id][k]
}), {});
return { ...el,
...extracted
};
});
}
console.info(copy(xyz, abc, ['height', 'weight']));
«Скопировать все свойства». Что ты имеешь в виду? В вашем коде не похоже, что вы пытаетесь скопировать определенный элемент из первого объекта?