Задать вопрос
  • Как отобразить каждое поле объекта Vue for loop?

    @oexlkinq
    это SFC конечно, но в целом логику не сложно вынуть
    <script setup>
    const test = {
        test2: {
            obj2: "test",
            obj3: "test",
        },
        test3: {
            obj2: "blab",
            obj3: "blabb2",
        }
    };
    </script>
    <template>
        <p>
            <template v-for="(entries, i) in Object.entries(test)">
                <span v-if="i > 0">,<br></span>
                {{ entries[0] }}: {<br>
                <span v-for="subEntries in Object.entries(entries[1]).map(entry => [entry[0], JSON.stringify(entry[1])])">
                    <span class="sub">{{ subEntries[0] + ': ' + subEntries[1] }}</span>,<br>
                </span>
                }
            </template>
        </p>
    </template>
    <style>
    p span.sub {
        padding-left: 10px;
    }
    </style>
    Ответ написан
    Комментировать
  • Как можно преобразовать массив из объектов с помощью функции reduce?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Делаем ровно то, что спрошено:

    const result = Object.values(data.reduce((acc, n) => (
      (acc[n.brand] ??= { ...n, price: 0 }).price += n.price,
      acc
    ), {}));

    Или, решаем задачу в более общем виде:

    function uniqueWithSum(data, key, sumKey) {
      const getKey = key instanceof Function ? key : n => n[key];
      const unique = new Map;
    
      for (const n of data) {
        const k = getKey(n);
        unique
          .set(k, unique.get(k) ?? Object.assign(new n.constructor, n, { [sumKey]: 0 }))
          .get(k)[sumKey] += n[sumKey];
      }
    
      return unique;
    }

    // ваш случай
    const result = [...uniqueWithSum(data, 'brand', 'price').values()];
    
    // элементам исходного массива не обязательно быть объектами
    Array.from(uniqueWithSum([
      [ 'aaa',   1 ],
      [ 'aaa',  10 ],
      [ 'aaa', 100 ],
      [ 'bbb', 666 ],
    ], 0, 1).values()) // [ [ 'aaa', 111 ], [ 'bbb', 666 ] ]
    Ответ написан
    1 комментарий