簡體   English   中英

從JSON數組鍵值對動態檢索鍵 - Javascript

[英]Retrieving Keys from JSON Array key-value pair dynamically - 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檢索密鑰

您是否正在使用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方法來區分對象的真實成員是明智的。

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;
    };

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 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])
    }
}

我認為這是最簡單的。

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 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
  }
}

我認為這應該像下面一樣遞歸地解析

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

停止重新發明輪子

Object.keys()

MDN

for-in inop就可以了。 在一個對象上它看起來像這樣:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM