16.11.2022, 23:24
|
Аспирант
|
|
Регистрация: 05.09.2019
Сообщений: 84
|
|
объединений массивов на js
Всем привет мне нужно объединить два массива с уникальными значениями у меня получилось но то гавно код я думаю можно сделать проще
const arrOne = [
{city: '111', price: 1},
{city: '222', price: 2},
]
const arrTwo = [
{city: '111', price: 0},
{city: '333', price: 0},
{city: '444', price: 0},
]
const res = arrOne.reduce((acc, cur, idx, def) => {
const findCity = arrTwo.filter(el => !def.find(it => it.city === el.city) )
console.log('findCity', findCity)
if(findCity && findCity.length > 0){
return [...acc, ...findCity, cur]
}
return [...acc, cur]
}, [])
console.log('res', [...new Set(res)] )
|
|
16.11.2022, 23:44
|
Аспирант
|
|
Регистрация: 05.09.2019
Сообщений: 84
|
|
let stopArray = false
const res2 = arrOne.reduce((acc, cur, idx, def) => {
const findCity = arrTwo.filter(el => !def.find(it => it.city === el.city))
if(findCity && findCity.length > 0 && !stopArray){
stopArray = true
return [...acc, ...findCity, cur]
}
return [...acc, cur]
}, [])
console.log('2', res2)
|
|
17.11.2022, 00:50
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
misha.korolcov,
const arrOne = [{
city: '111',
price: 1
},
{
city: '222',
price: 2
},
]
const arrTwo = [{
city: '111',
price: 0
},
{
city: '333',
price: 0
},
{
city: '444',
price: 0
},
]
const res = (...arr) => {
const obj = {};
return arr.flat().filter(ob => {
let {
city,
price
} = ob;
if (obj[city]) {
obj[city].price += price;
return false
} else {
obj[city] = ob
};
return true
})
}
console.log('res', res(arrOne, arrTwo))
|
|
17.11.2022, 03:06
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
рони, имхо, лучше такие вещи иммутабельно делать для надёжности:
const res = (...arr) => {
const acc = Object.create(null);
arr.flat().forEach(({ city, price, ...rest }) => {
if (acc[city]) {
acc[city].price += price;
} else {
acc[city] = { city, price, ...rest };
}
});
return Object.values(acc);
}
Но по задаче точно не скажешь. Впрочем по задаче не скажешь, что вообще надо что-то суммировать.)
__________________
29375, 35
|
|
17.11.2022, 04:59
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Aetae,
согласен!
|
|
17.11.2022, 05:54
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
let arrOne = [
{city: '111', price: 1},
{city: '222', price: 2},
];
let arrTwo = [
{city: '111', price: 0},
{city: '333', price: 0},
{city: '444', price: 0},
];
function mergeArray(a1, a2){
let check = a1.map( el1 => el1.city );
let a2filtered = a2.filter( el2 => !check.includes(el2.city) );
return a1.concat(a2filtered);
}
console.log( mergeArray(arrOne, arrTwo) );
|
|
17.11.2022, 06:30
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Белый шум, ты же понимаешь что твоя хрень будет через includes каждый раз перебирать весь массив, что приводит к квадратичной сложности?
__________________
29375, 35
|
|
17.11.2022, 07:07
|
|
Профессор
|
|
Регистрация: 19.01.2012
Сообщений: 505
|
|
Aetae,
Да. Я сначала запостил, потом посмотрел ваши варианты и понял что они лучше.
|
|
|
|