web-dev-qa-db-ja.com

JSON配列のキーと値のペアからキーを動的に取得する-Javascript

あなたの専門知識を求めたい質問があります。

これは私が持っているJSON配列です:

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

私がやりたいのは、値の代わりにJSON配列からキー(A、B、C、D、E)を取得することです。値は取得できますが、キーは取得できません。

私はこれを使用して値を動的に取得しています:

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を使用してkeysを取得するにはどうすればよいですか?

11
Queryer

タグが示すように 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's values
    return d3.sum(d3.values(d));
});
total; // 199
_
17
nrabinowitz

現在投稿されているすべてのソリューションに問題があります。 for ... inループを使用してオブジェクトを反復処理している間、それらのいずれも object.hasOwnProperty(prop) をチェックしません。これにより、プロパティがプロトタイプに追加された場合にファントムキーが表示される可能性があります。

引用 ダグラス・クロックフォード

オブジェクトのプロトタイプに追加されたメンバーが列挙に含まれることに注意してください。 hasOwnPropertyメソッドを使用して防御的にプログラムし、オブジェクトの真のメンバーを区別することをお勧めします。

Maericsの優れたソリューションにhasOwnPropertyのチェックを追加します。

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;
    };
11
Sahil Muthoo
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's how easy baby, it's gonna be")
alert(vals+" - tha's how easy baby, it's gonna be")

防御的に

@Sahilの防御方法を含む...

for (var key in easy) {
    if (easy.hasOwnProperty(key)) {
        keys.Push(key)
        vals.Push(easy[key])
    }
}
4
Billy Moon

使用する 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
Jordão

これが一番簡単だと思います。

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

結果:

["A", "B", "C", "D", "E"]
2
Do-Gyun Kim

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"]
2
maerics

これは以下のように再帰的に解析する必要があると思います

_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"]

0
user1686644

車輪の再発明をやめる

Object.keys()

[〜#〜] mdn [〜#〜]

0
gondwe
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));
0

A for-in- loopがトリックを行います。 1つのオブジェクトでは、次のようになります。

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

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

これを試して。簡単です:

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
  }
}
0
sangeeth kumar