Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   объединений массивов на js (https://javascript.ru/forum/misc/84688-obedinenijj-massivov-na-js.html)

misha.korolcov 16.11.2022 23:24

объединений массивов на 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)]  )

misha.korolcov 16.11.2022 23:44

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

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))

Aetae 17.11.2022 03:06

рони, имхо, лучше такие вещи иммутабельно делать для надёжности:
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);
}

Но по задаче точно не скажешь. Впрочем по задаче не скажешь, что вообще надо что-то суммировать.)

рони 17.11.2022 04:59

Aetae,
:) согласен!

Белый шум 17.11.2022 05:54

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) );

Aetae 17.11.2022 06:30

Белый шум, ты же понимаешь что твоя хрень будет через includes каждый раз перебирать весь массив, что приводит к квадратичной сложности?

Белый шум 17.11.2022 07:07

Aetae,
Да. Я сначала запостил, потом посмотрел ваши варианты и понял что они лучше.


Часовой пояс GMT +3, время: 12:43.