Помогите с массивом объектов, нужно из двух создать 1
У меня есть два массива такого плана
Mas1 = [{name: "Anton", age: "20"}, {name: "Artem", age: "23"}, {name: "Rafik", age: "32"}, {name: "Andrey", age: "30"};
Mas2= [{name: "Anton", status: "Yes"}, {name: "Artem", status: "Yes"}, {name: "Rafik", status: "No"}];
нужно создать третий массив, чтобы объединил их по name и получился массив такого плана -
Mas3= [{name: "Anton", age: "20", status: "Yes"}, {name: "Artem", age: "23", status: "Yes"}, {name: "Rafik", age: "32", status: "No"}, {name: "Andrey", age: "30"}];
Есть у кого-нибудь варианты решения? |
Aidec,
а можно с нормальными кавычками? |
Исправил)
|
Aidec,
<body>
<pre>
<script>
const Mas1 =[{name: "Anton", age: "20"}, {name: "Artem", age: "23"}, {name: "Rafik", age: "32"}, {name: "Andrey", age: "30"}];
const Mas2 =[{name: "Anton", status: "Yes"}, {name: "Artem", status: "Yes"}, {name: "Rafik", status: "No"}];
const createArr = (...arg) => {
const objName = {};
return arg.flat().reduce((ar, el)=>
{
let name = el.name;
let obj = objName[name];
if(!obj) ar.push(objName[name] = {...el});
else Object.assign(obj, el);
return ar;
}, []
)
};
const Mas3 = createArr(Mas1, Mas2);
document.body.append(JSON.stringify(Mas3))
</script></pre>
</body>
|
Спасибо
|
А можешь подсказать как решить такую проблему
<script>
var electrical =[{name: "Anton", age: "20"}, {name: "Artem", age: "#23"}, {name: "Rafik", age: "32"}, {name: "Andrey", age: "30"}];
var personal =[{name: "Anton", status: "7^W#Yes"}, {name: "Artem", status: "#Yes"}, {name: "Rafik", status: "hghg#No"}];
var createArr = (...arg) => {
var objName = {};
return [].concat(...arg).reduce((ar, el)=>
{
let name = el.name;
let obj = objName[name];
if(!obj) {objName[name] = {...el}; ar.push(objName[name])}
else Object.assign(obj, el);
return ar;
}, []
)
};
var arr = createArr(electrical, personal);
console.log(arr);
arr.forEach(function(element) {
if (element.hasOwnProperty("status")) {
element.status = (element.status).split('#')[1];
};
if (element.hasOwnProperty("age")) {
element.age = (element.age).split('#')[1];
};
});
</script>
получается проблема в том что там где # нет, мне выдает undefined, а как сделать так что бы у меня показывал место undefined тот тект который там указан без # Например вот так-
(4) [{…}, {…}, {…}, {…}]
0: {name: 'Anton', age: '20', status: 'Yes'}
1: {name: 'Artem', age: '23', status: 'Yes'}
2: {name: 'Rafik', age: '32', status: 'No'}
3: {name: 'Andrey', age: '30'}
length: 4
а так на данный момент -
(4) [{…}, {…}, {…}, {…}]
0: {name: 'Anton', age: undefined, status: 'Yes'}
1: {name: 'Artem', age: '23', status: 'Yes'}
2: {name: 'Rafik', age: undefined, status: 'No'}
3: {name: 'Andrey', age: undefined}
length: 4
|
Aidec,
не копируйте сообщения целиком. Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Хорошо, отредактировал.
Надеюсь вы поняли мою проблему и возможно знаете как она решается?) |
Aidec,
arr.forEach(function(element) {
if (element.hasOwnProperty("status")) {
element.status = (element.status).split('#')[1] || element.status;
};
if (element.hasOwnProperty("age")) {
element.age = +(element.age).split('#')[1] || +element.age;
};
});
|
спасибо, помогло:thanks:
|
Цитата:
Если я правильно понял то сплит не может примениться так как не к чему его применить. Я бы хотел узнать, можно ли сделать так что бы в таком случаем где выводит null у меня выводил место этого "Отсутствует" ? |
вот например так
(4) [{…}, {…}, {…}, {…}
0: {name: 'Anton', age: '20', status: 'Yes'}
1: {name: 'Artem', age: '23', status: 'Отсутствует'}
2: {name: 'Rafik', age: '32', status: 'No'}
3: {name: 'Andrey', age: '30'}
length: 4
а на данный момент вот так все выглядит
(4) [{…}, {…}, {…}, {…}
0: {name: 'Anton', age: '20', status: 'Yes'}
1: {name: 'Artem', age: '23', status: 'null'}
2: {name: 'Rafik', age: '32', status: 'No'}
3: {name: 'Andrey', age: '30'}
length: 4
и висит эта ошибка |
Aidec,
скорее всего split применяется к числу -- не знаю ваших реальных данных. но можно так попробовать element.age = +(''+element.age).split('#')[1] || +element.age; иначе пишите данные что есть на входе и что хотите на выходе. |
Aidec,
const ar = [ {name: 'Anton', age: '20', status: '123#Yes'}
, {name: 'Artem', age: '23', status: null}
, {name: 'Rafik', age: '32', status: 'No'}
, {name: 'Andrey', age: '30'}]
ar.forEach( ob => {
ob.status = ob.status ? ((ob.status).split('#')[1] || ob.status) : 'Отсутствует'
})
console.log(ar)
|
Благодарю, все четко заработало :thanks:
|
| Часовой пояс GMT +3, время: 22:41. |