#javascript #arrays
#javascript #массивы
Вопрос:
Я перебираю объект, который содержит несколько телефонных номеров в качестве ключей и массивы с объектами в качестве значений.
Я написал метод reduce, который группирует все расписания вместе, за исключением одной проблемы.
если вы запустите фрагмент, вы увидите, что res
это: {trackingNumber: [ [Array] ]}
Мне нужно, чтобы объект выглядел как: {trackingNumber: [Array]}
Проблема, с которой я продолжаю сталкиваться, заключается в том, что попытка вставить, нарезать или сделать что-либо по исходному индексу создает первый объединенный массив (Object.values (res)), в основном он перечисляет первый объект этого массива как первые 7 элементов значения, связанного с номером отслеживания.
{Отслеживающий номер: [0: строка, 1:строка, 2: строка, 3: {объект из строк в 0, 1 и 2}]}
Буду признателен за любую помощь.
let todayNewTollFree = [
{paymentSchedule: [{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},],
tracking: " 18003160182"},
{paymentSchedule: [{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},],
tracking: " 18003160182"
},
{
paymentSchedule: [],
tracking: " 12134105385"
},
{
paymentSchedule: [{amount:500},{amount:500},{amount:500},{amount:500},],
tracking: " 18007084605"
},
{
paymentSchedule:[{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},],
tracking: " 18007100629"
}
]
let test = todayNewTollFree.reduce(function (res, obj) {
let key = obj.tracking;
if (res[key]) {
res[key] = res[key].map((key) =>
[key].flat().concat(obj.paymentSchedule)
);
} else res[key] = [obj.paymentSchedule];
for (const tracking in res) {
let values = Object.values(res[key]).flat();
console.log(tracking);
console.log(values);
}
return res;
}, {});
console.log(test)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
for in
Цикл создает плоский массив правильно, но каждая моя попытка вернуться и вызвать или назначить отслеживание для вновь созданного массива не работает.
Комментарии:
1. Трудно помочь, когда размещенные данные абстрактны и не могут быть использованы для тестирования вашего кода. Попробуйте сгенерировать упрощенный минимальный набор, который имеет достаточно свойств, чтобы действительно запустить это. Затем из этого минималистичного набора предоставьте лучший пример ожидаемых результатов. Честно говоря, неясно, что отличается от вашего текущего вывода и ожидаемого результата. Примечание вы можете нажать на
<>
в редакторе вопросов и создать доступный для выполнения фрагмент стека, который регистрируется прямо на этой странице
Ответ №1:
При добавлении нового ключа к объекту вы не должны помещать его внутри литерала массива [...]
(поскольку это создает массив, первым элементом которого является array), а должны просто присвоить сам массив свойству. Кроме того, при добавлении в массив, Array#map
это не обязательно и Array#concat
выполнит свою работу.
let todayNewTollFree = [ {paymentSchedule: [{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},], tracking: " 18003160182"}, {paymentSchedule: [{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},], tracking: " 18003160182" }, { paymentSchedule: [], tracking: " 12134105385" }, { paymentSchedule: [{amount:500},{amount:500},{amount:500},{amount:500},], tracking: " 18007084605" }, { paymentSchedule:[{amount:500},{amount:500},{amount:500},{amount:500},{amount:500},], tracking: " 18007100629" } ]
let test = todayNewTollFree.reduce(function (res, obj) {
let key = obj.tracking;
if (res[key]) {
res[key] = res[key].concat(obj.paymentSchedule)
} else res[key] = obj.paymentSchedule;
return res;
}, {});
console.log(test)
Комментарии:
1. я как будто потрясен. потому что я клянусь перевернуть что-то или другое, я пробовал что-то настолько близкое к этому 1000 раз.
2. извините, мне пришлось уйти на второй да!