Помогите преобразовать массив
Помогите пожалуйста собрать массив, сломал уже всю голову. Опыта пока немного.
Есть 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 }
]
|
Вроде решил сам...
Правда в 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);
|
Яб использовал lodash - всё равно он везде есть:
unionBy(params, allData, 'idStandard') |
Без полифилов и покороче
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)
|
:) :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>
|
KingdaKa, ну чтука очень популярная поддерживаемая сообществом, так что код там должен быть приличным.
Но я стараюсь не смотреть в код библиотечных функций чтоб не расстраиваться. Пока работает и не является узким местом, само собой.) |
В этой миллион раз решавшейся на форумах задаче вопрос только один: каковы размеры массивов. Если небольшие, то можно не заморачиваться и сделать вложенный цикл О(N^2). Иначе - использовать Map. В лодаше наверняка через Map сделано, или как-то аналогично, т.е. с хорошей асимптотикой.
|
| Часовой пояс GMT +3, время: 10:51. |