あなたの専門知識を求めたい質問があります。
これは私が持っている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を取得するにはどうすればよいですか?
タグが示すように 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
_
現在投稿されているすべてのソリューションに問題があります。 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;
};
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])
}
}
使用する 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;
これが一番簡単だと思います。
var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
Object.keys( a[0] );
結果:
["A", "B", "C", "D", "E"]
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"]
これは以下のように再帰的に解析する必要があると思います
_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"]
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));
A for-in
- loopがトリックを行います。 1つのオブジェクトでは、次のようになります。
var o = {
a: 5,
b: 3
};
var num = 0;
for (var key in o) {
num += o[key];
}
alert(num);
これを試して。簡単です:
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
}
}