Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.11.2022, 23:24
Аспирант
Отправить личное сообщение для misha.korolcov Посмотреть профиль Найти все сообщения от misha.korolcov
 
Регистрация: 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)]  )
Ответить с цитированием
  #2 (permalink)  
Старый 16.11.2022, 23:44
Аспирант
Отправить личное сообщение для misha.korolcov Посмотреть профиль Найти все сообщения от misha.korolcov
 
Регистрация: 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)
Ответить с цитированием
  #3 (permalink)  
Старый 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))
Ответить с цитированием
  #4 (permalink)  
Старый 17.11.2022, 03:06
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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
Ответить с цитированием
  #5 (permalink)  
Старый 17.11.2022, 04:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Aetae,
согласен!
Ответить с цитированием
  #6 (permalink)  
Старый 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) );
Ответить с цитированием
  #7 (permalink)  
Старый 17.11.2022, 06:30
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Белый шум, ты же понимаешь что твоя хрень будет через includes каждый раз перебирать весь массив, что приводит к квадратичной сложности?
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 17.11.2022, 07:07
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу JS разработчиков в лесу Kenjuy27 Работа 0 18.07.2018 09:06
Диалог между HTML и внешним JS в контексте расширения GoogleChrome ev1lart Events/DOM/Window 0 26.04.2017 19:25
BackEnd/FrontEnd Developer (Native JS) Abab Работа 0 25.12.2016 10:56
js стиль render для react.js vflash Ваши сайты и скрипты 5 01.04.2016 22:57
Картинка обрабатывается js 4yBaK Общие вопросы Javascript 10 11.09.2011 09:28