Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.10.2021, 15:25
Интересующийся
Отправить личное сообщение для AlexandrDr Посмотреть профиль Найти все сообщения от AlexandrDr
 
Регистрация: 22.11.2018
Сообщений: 11

Помогите преобразовать массив
Помогите пожалуйста собрать массив, сломал уже всю голову. Опыта пока немного.

Есть 2 массива с объектами:
let allData = [
  { idStandard: 1278, valueDecNew: 8 },
  { idStandard: 1279, valueDecNew: 3 },
  { idStandard: 1280, valueDecNew: 6 },
  { idStandard: 1284, valueDecNew: 56 }
 ] 

let params = [
  { idStandard: 1278, valueDecNew: 0 },
  { idStandard: 1279, valueDecNew: 0 },
  { idStandard: 1282, valueDecNew: 0 }
]

Необходимо добавить в массив allData значения массива params, но если в allData и params есть объекты c одинаковыми idStandard, то в результат нужно брать только объект из params

В итоге должен получится массив:
let result = [
  { idStandard: 1278, valueDecNew: 0 },
  { idStandard: 1279, valueDecNew: 0 },
  { idStandard: 1280, valueDecNew: 6 },
  { idStandard: 1284, valueDecNew: 56 },
  { idStandard: 1282, valueDecNew: 0 }
]
Ответить с цитированием
  #2 (permalink)  
Старый 14.10.2021, 16:31
Интересующийся
Отправить личное сообщение для AlexandrDr Посмотреть профиль Найти все сообщения от AlexandrDr
 
Регистрация: 22.11.2018
Сообщений: 11

Вроде решил сам...
Правда в ie приходится использовать полифилы для Object.values и findIndex

let rawData = params.concat(allData)


let result = Object.values(rawData.reduce(function(acc, n) {
    const i = acc.findIndex(m => n.idStandard === m.idStandard);
  if (!~i || !acc[i].valueDecNew === 0) {
    acc.push(n);    
  }
  return acc;
}, [])
)

console.log(result);
Ответить с цитированием
  #3 (permalink)  
Старый 14.10.2021, 16:31
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

Яб использовал lodash - всё равно он везде есть:
unionBy(params, allData, 'idStandard')
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 14.10.2021, 19:05
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,692

Без полифилов и покороче

let allData = [
  { idStandard: 1278, valueDecNew: 8 },
  { idStandard: 1279, valueDecNew: 3 },
  { idStandard: 1280, valueDecNew: 6 },
  { idStandard: 1284, valueDecNew: 56 }
 ]
 
let params = [
  { idStandard: 1278, valueDecNew: 0 },
  { idStandard: 1279, valueDecNew: 0 },
  { idStandard: 1282, valueDecNew: 0 }
]

let result = params.concat(allData.filter (function (x) {
    return ! params.some (function (y) {return x.idStandard === y.idStandard})
}))

console.log(result)
Ответить с цитированием
  #5 (permalink)  
Старый 14.10.2021, 19:39
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064


<pre>

    <script>
        let allData = [{
                idStandard: 1278,
                valueDecNew: 8
            },
            {
                idStandard: 1279,
                valueDecNew: 3
            },
            {
                idStandard: 1280,
                valueDecNew: 6
            },
            {
                idStandard: 1284,
                valueDecNew: 56
            }
        ]

        let params = [{
                idStandard: 1278,
                valueDecNew: 0
            },
            {
                idStandard: 1279,
                valueDecNew: 0
            },
            {
                idStandard: 1282,
                valueDecNew: 0
            }
        ]

        let arr = params.map(function(x) {
            return x.idStandard
        });
        let allfilter = allData.filter(function(x) {
            return arr.indexOf(x.idStandard) === -1
        })

        let result = params.concat(allfilter).sort(function(a, b) {
    return a.idStandard - b.idStandard
})

        document.write(JSON.stringify(result, "", 1))
    </script> </pre>
Ответить с цитированием
  #6 (permalink)  
Старый 15.10.2021, 02:48
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,480

KingdaKa, ну чтука очень популярная поддерживаемая сообществом, так что код там должен быть приличным.
Но я стараюсь не смотреть в код библиотечных функций чтоб не расстраиваться. Пока работает и не является узким местом, само собой.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 15.10.2021, 09:05
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

В этой миллион раз решавшейся на форумах задаче вопрос только один: каковы размеры массивов. Если небольшие, то можно не заморачиваться и сделать вложенный цикл О(N^2). Иначе - использовать Map. В лодаше наверняка через Map сделано, или как-то аналогично, т.е. с хорошей асимптотикой.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив объектов doox911 Библиотеки/Тулкиты/Фреймворки 6 16.01.2014 22:36
Помогите сократить код (преобразовать в цикл) eko24 jQuery 5 09.11.2012 00:19
помогите преобразовать javascript в jquery Rayzor jQuery 1 13.09.2012 12:00
преобразовать php массив в массив js zebulun Общие вопросы Javascript 12 02.09.2011 00:49
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14