Я хочу динамически создавать массивы значений объектов на основе их ключей из массива похожих объектов - PullRequest
0 голосов
/ 10 февраля 2019

Вот мой массив объектов JavaScript:

inventoryArray = [
    {name: 'pizza', category: 'food', unique: 'no', amount: 12}
    {name: 'bow', category: 'weapon', unique: 'no', amount: 1}
    {name: 'pizza', category: 'food', unique: 'yes', amount: 1}
]

Все они имеют одинаковые ключи и большинство имеют разные значения.

Я хочу создать массив значений на основе ключей, которые динамическивыглядит так:

values = [
    ['pizza', 'bow', 'pizza'] // name
    ['food', 'weapon', 'food'] // category
    ['no', 'no', 'yes'] //unique
    [12, 1, 1] // amount
    // TODO only add distinct values:
    // i.e. first array would be ['pizza', 'bow']
]

Самое близкое, что я получил, это:

const keys = [];
const values = [];
for(let i = 0; i < inventoryArray.length; i++){
    keys[i] = Object.keys(inventoryArray[i]);
}
for(let i = 0; i < keys[0].length; i++) {
    const value = [];
    for(let j = 0; j < inventoryArray.length; j++) {            
        value[j] = inventoryArray[j][keys[j][i]];
    }
    values[i] = value;
}

Да, я знаю, это уродливо.

То, что keys[0] во втором цикле for не очень динамично.Правильно?

Я все еще довольно новичок в JavaScript, и я попытался поэкспериментировать с методом map для массивов, но не смог заставить его динамически создавать их все.Просто по одному:

const names = inventoryArray.map(a => a.name);

Заранее спасибо!

1 Ответ

0 голосов
/ 10 февраля 2019

Создайте массив реквизитов, которые вы хотите в правильном порядке.Используйте вложенные вызовы Array.map() для создания матрицы.Вы можете использовать Set , чтобы различать значения.

const inventoryArray = [{"name":"pizza","category":"food","unique":"no","amount":12},{"name":"bow","category":"weapon","unique":"no","amount":1},{"name":"pizza","category":"food","unique":"yes","amount":1}]

const props = ['name', 'category', 'unique', 'amount']

const result = props.map(p =>
  [...new Set(inventoryArray.map(o => o[p]))]
)

console.log(result)
...