Помогите преобразовать массив
Помогите пожалуйста собрать массив, сломал уже всю голову. Опыта пока немного.
Есть 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, время: 09:37. |