Значение объекта в массиве не определено - PullRequest
0 голосов
/ 11 мая 2019

Мне нужно получить значение из объекта массива. Но если я позвоню прямо, я получу неопределенное. Я пишу пример и код ниже.

Итак, я создаю массив объектов. Пример:

const convertedDataTest = [ [ { S1: [Array],
      C1: [Array],
      S2: [Array],
      C2: [Array],
      S3: [Array],
      C3: [Array],
      S4: [Array],
      C4: [Array],
      S5: [Array],
      C5: [Array],
      CLASS: [Array] } ],
  [ { S1: [Array],
      C1: [Array],
      S2: [Array],
      C2: [Array],
      S3: [Array],
      C3: [Array],
      S4: [Array],
      C4: [Array],
      S5: [Array],
      C5: [Array],
      CLASS: [Array] } ],
  [ { S1: [Array],
      C1: [Array],
      S2: [Array],
      C2: [Array],
      S3: [Array],
      C3: [Array],
      S4: [Array],
      C4: [Array],
      S5: [Array],
      C5: [Array],
      CLASS: [Array] } ] ]

Если я вызову значение массива

console.log(convertedDataTest[1]);

Я вижу все, но если я вызываю значение объекта:

console.log(convertedDataTest[1].CLASS);

Я получаю неопределённость.

Также я создаю этот массив объектов с помощью метода карты и нескольких функций.

function arrayMaker(length, val) {
    let arr = [];
    for (let i = 0; i < length; i++) {
        if (i == val - 1 || (i == 0 && val == 0)) arr.push(1);
        else arr.push(0);
    }

    return arr;
}

function convertData(data) {
    const convertedData = data.map(item => {
        return [
            {
                S1: arrayMaker(4, item.S1),
                C1: arrayMaker(13, item.C1),
                S2: arrayMaker(4, item.S2),
                C2: arrayMaker(13, item.C2),
                S3: arrayMaker(4, item.S3),
                C3: arrayMaker(13, item.C3),
                S4: arrayMaker(4, item.S4),
                C4: arrayMaker(13, item.C4),
                S5: arrayMaker(4, item.S5),
                C5: arrayMaker(13, item.C5),
                CLASS: arrayMaker(10, item.CLASS)
            }
        ];
    });
    return convertedData;
}
const convertedData = convertData(data);
const convertedDataTest = convertData(dataTest);

Пример данных:

[
    { "S1": 4, "C1": 11, "S2": 2, "C2": 9, "S3": 1, "C3": 5, "S4": 3, "C4": 9, "S5": 2, "C5": 7, "CLASS": 1 },
    { "S1": 4, "C1": 5, "S2": 2, "C2": 3, "S3": 1, "C3": 1, "S4": 3, "C4": 10, "S5": 2, "C5": 6, "CLASS": 0 },
    { "S1": 3, "C1": 8, "S2": 2, "C2": 7, "S3": 2, "C3": 3, "S4": 3, "C4": 7, "S5": 1, "C5": 12, "CLASS": 1 },
    { "S1": 3, "C1": 12, "S2": 4, "C2": 8, "S3": 4, "C3": 7, "S4": 3, "C4": 3, "S5": 1, "C5": 6, "CLASS": 0 },
    { "S1": 1, "C1": 2, "S2": 2, "C2": 12, "S3": 1, "C3": 8, "S4": 1, "C4": 13, "S5": 3, "C5": 1, "CLASS": 0 },
    { "S1": 2, "C1": 7, "S2": 2, "C2": 5, "S3": 4, "C3": 9, "S4": 4, "C4": 6, "S5": 1, "C5": 9, "CLASS": 1 },
    { "S1": 2, "C1": 2, "S2": 1, "C2": 13, "S3": 2, "C3": 13, "S4": 4, "C4": 3, "S5": 4, "C5": 13, "CLASS": 3 },
    { "S1": 4, "C1": 10, "S2": 4, "C2": 11, "S3": 1, "C3": 10, "S4": 2, "C4": 9, "S5": 4, "C5": 1, "CLASS": 1 },
    { "S1": 4, "C1": 2, "S2": 3, "C2": 10, "S3": 4, "C3": 7, "S4": 4, "C4": 10, "S5": 2, "C5": 6, "CLASS": 1 },
    { "S1": 2, "C1": 8, "S2": 4, "C2": 13, "S3": 3, "C3": 8, "S4": 3, "C4": 2, "S5": 4, "C5": 2, "CLASS": 2 }
]

Ответы [ 3 ]

1 голос
/ 11 мая 2019

Вы не создаете массив объектов.Вы создаете массив массива объектов в вашем .map(...).

map(), создаете новый массив с возвращенными элементами, и вы возвращаете на карту следующее:

return [ // Returning an array.
    {...}
];

Таким образом, окончательный массив будет таким:

[
    [ // The array returned in map
        {S1: ..., CLASS: ...}
    ],
    [ // The array returned in map
        {S1: ..., CLASS: ...}
    ]
]

Обратите внимание, что каждый элемент массива не является объектом, но другой массив содержит объект.

Вы должны изменить .map() на это:

function convertData(data) {
    const convertedData = data.map(item => {
        return { // Note how I removed the [
            S1: arrayMaker(4, item.S1),
            C1: arrayMaker(13, item.C1),
            S2: arrayMaker(4, item.S2),
            C2: arrayMaker(13, item.C2),
            S3: arrayMaker(4, item.S3),
            C3: arrayMaker(13, item.C3),
            S4: arrayMaker(4, item.S4),
            C4: arrayMaker(13, item.C4),
            S5: arrayMaker(4, item.S5),
            C5: arrayMaker(13, item.C5),
            CLASS: arrayMaker(10, item.CLASS)
        };  // Note how I removed the ]
    });
    return convertedData;
}

Обратите внимание, как я удалил [ и ], и я просто возвращаю нужный вам объект.

1 голос
/ 11 мая 2019
const convertedDataTest = [ { S1: [ 0, 0, 0, 1 ],
    C1: [ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ],
    S2: [ 0, 1, 0, 0 ],
    C2: [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    S3: [ 1, 0, 0, 0 ],
    C3: [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ],
    S4: [ 0, 0, 1, 0 ],
    C4: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ],
    S5: [ 0, 1, 0, 0 ],
    C5: [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
    CLASS: [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } ]

convertDataTest - это массив, в котором есть только 1 объект, доступный по индексу 0. Поэтому, когда вы пытаетесь получить значение из индекса 1, он возвращает неопределенное значение.

Вы можете получить массив классов по этой строке

convertedDataTest[0].CLASS
0 голосов
/ 11 мая 2019

Ваш код, кажется, упаковывает данные в дополнительный массив, поэтому convertedData[0][0].CLASS будет определено. Если вы удалите массив из оператора return в функции convertData, как показано ниже, convertedData[0].CLASS будет работать.

var data = [
    { "S1": 4, "C1": 11, "S2": 2, "C2": 9, "S3": 1, "C3": 5, "S4": 3, "C4": 9, "S5": 2, "C5": 7, "CLASS": 1 },
    { "S1": 4, "C1": 5, "S2": 2, "C2": 3, "S3": 1, "C3": 1, "S4": 3, "C4": 10, "S5": 2, "C5": 6, "CLASS": 0 },
    { "S1": 3, "C1": 8, "S2": 2, "C2": 7, "S3": 2, "C3": 3, "S4": 3, "C4": 7, "S5": 1, "C5": 12, "CLASS": 1 },
    { "S1": 3, "C1": 12, "S2": 4, "C2": 8, "S3": 4, "C3": 7, "S4": 3, "C4": 3, "S5": 1, "C5": 6, "CLASS": 0 },
    { "S1": 1, "C1": 2, "S2": 2, "C2": 12, "S3": 1, "C3": 8, "S4": 1, "C4": 13, "S5": 3, "C5": 1, "CLASS": 0 },
    { "S1": 2, "C1": 7, "S2": 2, "C2": 5, "S3": 4, "C3": 9, "S4": 4, "C4": 6, "S5": 1, "C5": 9, "CLASS": 1 },
    { "S1": 2, "C1": 2, "S2": 1, "C2": 13, "S3": 2, "C3": 13, "S4": 4, "C4": 3, "S5": 4, "C5": 13, "CLASS": 3 },
    { "S1": 4, "C1": 10, "S2": 4, "C2": 11, "S3": 1, "C3": 10, "S4": 2, "C4": 9, "S5": 4, "C5": 1, "CLASS": 1 },
    { "S1": 4, "C1": 2, "S2": 3, "C2": 10, "S3": 4, "C3": 7, "S4": 4, "C4": 10, "S5": 2, "C5": 6, "CLASS": 1 },
    { "S1": 2, "C1": 8, "S2": 4, "C2": 13, "S3": 3, "C3": 8, "S4": 3, "C4": 2, "S5": 4, "C5": 2, "CLASS": 2 }
];


function arrayMaker(length, val) {
    let arr = [];
    for (let i = 0; i < length; i++) {
        if (i == val - 1 || (i == 0 && val == 0)) arr.push(1);
        else arr.push(0);
    }

    return arr;
}

function convertData(data) {
    const convertedData = data.map(item => {
        return {
                S1: arrayMaker(4, item.S1),
                C1: arrayMaker(13, item.C1),
                S2: arrayMaker(4, item.S2),
                C2: arrayMaker(13, item.C2),
                S3: arrayMaker(4, item.S3),
                C3: arrayMaker(13, item.C3),
                S4: arrayMaker(4, item.S4),
                C4: arrayMaker(13, item.C4),
                S5: arrayMaker(4, item.S5),
                C5: arrayMaker(13, item.C5),
                CLASS: arrayMaker(10, item.CLASS)
            };
    });
    return convertedData;
}
const convertedData = convertData(data);

console.log(convertedData[0].CLASS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...