Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите преобразовать массив (https://javascript.ru/forum/misc/83206-pomogite-preobrazovat-massiv.html)

AlexandrDr 14.10.2021 15:25

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

Есть 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 }
]

AlexandrDr 14.10.2021 16:31

Вроде решил сам...
Правда в 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);

Aetae 14.10.2021 16:31

Яб использовал lodash - всё равно он везде есть:
unionBy(params, allData, 'idStandard')

voraa 14.10.2021 19:05

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

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)

рони 14.10.2021 19:39

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

Aetae 15.10.2021 02:48

KingdaKa, ну чтука очень популярная поддерживаемая сообществом, так что код там должен быть приличным.
Но я стараюсь не смотреть в код библиотечных функций чтоб не расстраиваться. Пока работает и не является узким местом, само собой.)

Alexandroppolus 15.10.2021 09:05

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


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