Подтвердить что ты не робот

Получение ключей из пары ключей JSON Array динамически - Javascript

У меня есть вопрос, который хотел бы получить ваш опыт.

Это массив JSON, который у меня есть:

[{"A":20,"B":32,"C":27,"D":30,"E":40}]

Что я хотел бы сделать, так это получить ключи (A, B, C, D, E) из массива JSON вместо значений. Я могу получить значения, но не ключи.

Я использую это для динамического извлечения значений:

function calculateSum(jsonArray) {
    var result = 0;
    for (var i = jsonArray.length - 1;  i >= 0; --i)
    {
        var o = jsonArray[i];
        A = o.A;
        B = o.B;
        C = o.C;
        D = o.D;
        E = o.E;
        result = A + B + C + D + E;
        return result;
    }

    return result;
}

Аналогично, что мне делать, чтобы извлечь ключи с помощью JavaScript?

4b9b3361

Ответ 1

Используете ли вы D3.js, как указывает ваш тег? Потому что в этом случае вы можете просто использовать d3.keys():

var data = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
d3.keys(data[0]); // ["A", "B", "C", "D", "E"] 

Если вам нужна сумма всех значений, вам может быть лучше использовать d3.values() и d3.sum():

var data = [{"A":20,"B":32,"C":27,"D":30,"E":40}, {"F":50}];
// get total of all object totals
var total = d3.sum(data, function(d) {
    // get total of a single object values
    return d3.sum(d3.values(d));
});
total; // 199

Ответ 2

Все существующие решения, выпущенные на текущий момент, имеют проблему. Ни один из них не проверяет object.hasOwnProperty(prop), итерации по объекту с помощью цикла for... in. Это может привести к появлению клавиш phantom, если свойства будут добавлены в прототип.

Цитата Дуглас Крокфорд

Имейте в виду, что члены, которые добавлены к прототипу объекта, будут включены в перечисление. Целесообразно запрограммировать защиту с помощью метода hasOwnProperty, чтобы отличить истинных членов объекта.

Добавление проверки для hasOwnProperty к превосходному решению maerics.

var getKeys = function (arr) {
        var key, keys = [];
        for (i = 0; i < arr.length; i++) {
            for (key in arr[i]) {
                if (arr[i].hasOwnProperty(key)) {
                    keys.push(key);
                }
            }
        }
        return keys;
    };

Ответ 3

Используйте for .. in:

var result = 0;

for (var i = jsonArray.length - 1; i >= 0; --i) {
    var o = jsonArray[i];
    for (var key in o) {
      if (o.hasOwnProperty(key)) {
        result += o[key];
      }
    }
    // in your code, you return result here, 
    // which might not give the right result 
    // if the array has more than 1 element
}

return result;

Ответ 4

var easy = {
    a: 1,
    b: 2,
    c: 3
}

var keys = [], vals = []
for (var key in easy) {
    keys.push(key)
    vals.push(easy[key])
}

alert(keys+" - tha how easy baby, it gonna be")
alert(vals+" - tha how easy baby, it gonna be")

защищаясь

Включая защитный метод @Sahil...

for (var key in easy) {
    if (easy.hasOwnProperty(key)) {
        keys.push(key)
        vals.push(easy[key])
    }
}

Ответ 5

Попробуйте использовать инструкцию JavaScript for..in:

var getKeys = function(arr) {
  var key, keys = [];
  for (i=0; i<arr.length; i++) {
    for (key in arr[i]) {
      keys.push(key);
    }
  }
  return keys;
};

var a = [{"A":20, "B":32, "C":27, "D":30, "E":40}, {"F":50}]
getKeys(a); // => ["A", "B", "C", "D", "E", "F"]

Ответ 6

Я думаю, что это самый простой.

var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
Object.keys( a[0] );

Результат:

["A", "B", "C", "D", "E"]

Ответ 7

A for-in -loop делает трюк. На одном объекте это выглядит так:

var o = {
    a: 5,
    b: 3
};
var num = 0;

for (var key in o) {
    num += o[key];
}
alert(num);

Ответ 8

Попробуйте это. Это просто:

var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];

for(var i in a){
  for(var j in a[i]){
    console.log(j); // shows key
    console.log(a[i][j]); // shows value
  }
}

Ответ 9

Я думаю, что это должно быть рекурсивно проанализировано, как показано ниже

var getKeys = function(previousKeys,obj){
        var currentKeys = Object.keys(obj);
        previousKeys = previousKeys.concat(currentKeys);
        for(var i=0;i<currentKeys.length;i++){
            var innerObj = obj[currentKeys[i]];
            if(innerObj!==null && typeof innerObj === 'object' && !Array.isArray(innerObj)){
            return this.getKeys(previousKeys,innerObj);
            }
        }
        return previousKeys;
    }

использование: getKeys([],{"a":"1",n:{c:"3",e:{ f:4,g:[1,2,3]}}})

Результат: [ "a", "n", "c", "e", "f", "g" ]

Ответ 10

var _ = require('underscore');

var obj = [{"A":20,"B":32,"C":27,"D":30,"E":40},{"F":50}, {"G":60,"H":70},{"I":80}];

var keys = [], values = [];



_.each(obj, function(d) {

     keys.push(_.keys(d));

     values.push(_.values(d));
});


// Keys   ->  [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' ]
console.log('Keys   -> ', _.flatten(keys ));
// Values ->  [ 20, 32, 27, 30, 40, 50, 60, 70, 80 ]
console.log('Values -> ', _.flatten(values));