Индекс -1 для ключа json - PullRequest
0 голосов
/ 20 марта 2020

Я некоторое время искал ответы на этот вопрос и, похоже, не вижу очевидного.

Я пытаюсь вернуть значение по индексу json строки. Хотя ключ кажется совпадающим, он возвращает -1 для индекса. Я просто хочу значение, в данном случае «Ethan» для ключевого имени пользователя. Я проверил, что строки действительны json.

for (var r in rows) {
            table_body += '<tr>';
            for (var c in cols) {

                table_body += '<td>';
                //table_body += Object.keys(rows[r]);
                var idx = c;
                console.log(rows[r]);
                var o = rows[r]; //the object
                //var key = Object.keys(o)[idx];

                var key = cols[c].title;
                var index = Object.keys(cols).indexOf(key);
                console.log('key: '+key);
                console.log('index: ' + index);
                console.log('cols: ');
                console.log(cols[c]);
                console.log('c: ' + c);
                var value = o[index];
                table_body += value;
                table_body += '</td>';
            }
            table_body += '</tr>';
        }
        table_body += '</table>';

Это вывод в консоли, показывающий "o", который является json, ключ, который является именем пользователя, и индекс этого ключа -1

enter image description here

РЕДАКТИРОВАТЬ добавлено больше журналов ... enter image description here

РЕДАКТИРОВАТЬ Это json для строк ...

[{"id":136,"userName":"ethan","halfDays":1,"fullDays":11,"approvedDept":null,"approvedExec":true,"type":"vacation","createDate":"\/Date(1332863557393)\/","approvedDeptDate":null,"approvedExecDate":null,"leaveBegin":"\/Date(1311570000000)\/","leaveEnd":"\/Date(1311570000000)\/","notes":"Beginning Balance","overage":false,"department":null,"reminderSent":true},{"id":381,"userName":"ethan","halfDays":0,"fullDays":1,"approvedDept":null,"approvedExec":true,"type":"sick","createDate":"\/Date(1336055792800)\/","approvedDeptDate":null,"approvedExecDate":"\/Date(1336021200000)\/","leaveBegin":"\/Date(1335502800000)\/","leaveEnd":"\/Date(1335502800000)\/","notes":null,"overage":false,"department":"Marketing","reminderSent":true}]

и столбцов ...

[{ "title":"userName" },{ "title":"leaveBegin" },{ "title":"leaveEnd" }]

Ответы [ 3 ]

1 голос
/ 20 марта 2020

cols - это массив объектов, Object.keys() просто возвращает массив индексов массива, а не значения title свойств объектов.

Используйте findIndex() для поиска соответствующий объект.

var index = cols.findIndex(obj => obj.title == key)

В качестве альтернативы, перед циклами вы можете создать объект, который сопоставляет все ключи с их индексами, и используйте его.

var indexes = {};
cols.forEach(({title}, index) => indexes[title] = index);

Затем в l oop вы бы сделали

var index = key in indexes ? indexes[key] : -1;
1 голос
/ 20 марта 2020

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

const row = { username: 'a', leaveBegin: 'b', leaveEnd: 'c'}

рассмотрим столбец:

const col = {title: 'username'}

, вы получите значение, связанное с имя пользователя с

row[col.title] //'a'

теперь столбцы массива:

const cols = [{ "title":"userName" },{ "title":"leaveBegin" },{ "title":"leaveEnd" }]
const values = cols.map(({ title }) => row[title]) // ['a', 'b', 'c']

Наконец для каждой строки:

const rows = [{"id":136,"userName":"ethan","halfDays":1,"fullDays":11,"approvedDept":null,"approvedExec":true,"type":"vacation","createDate":"\/Date(1332863557393)\/","approvedDeptDate":null,"approvedExecDate":null,"leaveBegin":"\/Date(1311570000000)\/","leaveEnd":"\/Date(1311570000000)\/","notes":"Beginning Balance","overage":false,"department":null,"reminderSent":true},{"id":381,"userName":"ethan2","halfDays":0,"fullDays":1,"approvedDept":null,"approvedExec":true,"type":"sick","createDate":"\/Date(1336055792800)\/","approvedDeptDate":null,"approvedExecDate":"\/Date(1336021200000)\/","leaveBegin":"\/Date(1335502800001)\/","leaveEnd":"\/Date(1335502800002)\/","notes":null,"overage":false,"department":"Marketing","reminderSent":true}]
const cols = [{ "title":"userName" },{ "title":"leaveBegin" },{ "title":"leaveEnd" }]
rows.forEach(row => {
  cols.forEach(({ title }) => {
    console.log(title, row[title])
  })
})
1 голос
/ 20 марта 2020

Похоже, вы хотите найти индекс в массиве объектов. Используйте findIndex :

let cols = [{ "title":"userName" },{ "title":"leaveBegin" },{ "title":"leaveEnd" }];
let index = cols.findIndex(col => col.title == "leaveBegin");
console.log(index);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...