在Javascript对象中保持未知项计数

在Javascript对象中保持未知项计数,javascript,object,Javascript,Object,我正在分析一个数据源,并希望在JS中填充一个对象,以完成如下操作: data = { "USA": {"NY":{"active":5,"inactive":2}}, {"WA":{"active":16,"inactive":11}}, "Canada": {"NY":{"active":5,"inactive":2}} } var data = {} data["USA"]["NY"]["active"] = data["U

我正在分析一个数据源,并希望在JS中填充一个对象,以完成如下操作:

data = {
    "USA":
        {"NY":{"active":5,"inactive":2}},
        {"WA":{"active":16,"inactive":11}},
    "Canada":
        {"NY":{"active":5,"inactive":2}}
}
var data = {}
data["USA"]["NY"]["active"] = data["USA"]["NY"]["active"]++;
一开始,我不知道我将获得多少国家或州的数据。所以我开始是这样的:

data = {
    "USA":
        {"NY":{"active":5,"inactive":2}},
        {"WA":{"active":16,"inactive":11}},
    "Canada":
        {"NY":{"active":5,"inactive":2}}
}
var data = {}
data["USA"]["NY"]["active"] = data["USA"]["NY"]["active"]++;
然后尝试像这样填充数据:

data = {
    "USA":
        {"NY":{"active":5,"inactive":2}},
        {"WA":{"active":16,"inactive":11}},
    "Canada":
        {"NY":{"active":5,"inactive":2}}
}
var data = {}
data["USA"]["NY"]["active"] = data["USA"]["NY"]["active"]++;

但它不起作用。

您需要对对象的每个级别进行检查,如果未设置,则将对象作为默认值或数字为零

var data={};
数据[“美国”]=数据[“美国”]|{};
数据[“美国”][“纽约”]=数据[“美国”][“纽约”]|{};
数据[“美国”][“纽约”][“活跃”]=数据[“美国”][“纽约”][“活跃”]| 0;
数据[“美国”][“纽约”][“活动”]+;
控制台日志(数据)
你是:

  • 数据[“美国”][“纽约”][“活动”]
    的值(即2)
  • 递增
    数据[“美国”][“纽约”][“活动”]
    (因此现在是3)
  • 将所取的值(2)分配给
    数据[“美国”][“纽约”][“活动”]
    (有效地逆转了上一步的效果)
  • 如果要增加该值,请执行以下操作:

    data["USA"]["NY"]["active"]++;
    

    …仅此而已,仅此而已。

    您不能以这种方式动态创建对象属性。因此,您正在正确创建数据对象:

    var data = {}
    
    但下一行是错误的,因为:

    数据[“USA”]
    此时未定义,因此您无法访问
    未定义的
    [“NY”]
    ,这将引发异常。因此,您不仅需要初始化根
    数据
    对象,还需要为该对象的每个属性初始化一个对象

    你可以按字面意思做:

    if(!data["USA"]) 
        data["USA"] = {};
    
    或者使用
    | |
    操作符,如果存在相同的对象,则将该对象分配给
    数据[“USA”]
    (因此基本上不起作用),或者创建一个新对象:

    data["USA"] = data["USA"] || {};
    
    现在,您需要对无法访问的每个对象执行此逻辑。因此,使用较短的语法:

    data["USA"] = data["USA"] || {};
    data["USA"]["NY"] = data["USA"]["NY"] || {};
    data["USA"]["NY"]["active"] = data["USA"]["NY"]["active"] || 0; 
    
    在这之后,您的对象结构就准备好了,请记住,
    ++
    是一个返回数字的操作符,然后再向该数字添加一个

    因此:

    不会更改号码,您必须执行以下任一操作:

    data["USA"]["NY"]["active"]++;
    
    或:


    您可以使用
    reduce()
    创建自己的函数,该函数可以将字符串作为嵌套对象键并构建深层对象结构

    var data={}
    函数添加(str){
    var arr=str.split(“.”)
    返回arr.reduce(函数(r,e,i){
    返回arr.length-1!=i?r[e]| |(r[e]={}):r[e]=(r[e]| | 0)+1
    },数据)
    }
    添加('USA.NY.active')
    添加('USA.NY.active')
    添加('USA.NY.inactive')
    添加('Canada.NY.active')
    console.log(数据)