JavaScript:动态添加新值以更新JSON /对象

时间:2015-07-28 13:48:10

标签: javascript json

我已经为所有年份(2年,2015年和2014年)动态创建了对象(预定义)并将值设置为0表示所有月份(实际上是12个月,我只显示了3个月)。所以我的数据网格将看起来所有月份的0值。见下面的代码

 var arrayObj = [
               {"year" : 2015, "month" : "JAN", "value" : 0},
               {"year" : 2015, "month" : "FEB", "value" : 0},
               {"year" : 2015, "month" : "MAR", "value" : 0},
               {"year" : 2014, "month" : "JAN", "value" : 0},
               {"year" : 2014, "month" : "FEB", "value" : 0},
               {"year" : 2014, "month" : "MAR", "value" : 0}
             ];

我会定期在表单提交后以对象格式继续获得单个月的价值。

   eq. {"year" : 2015, "month" : "FEB", "value" : 2.33}

所以我的原始对象也应该相应地改变,使用javascript代码。像下面..

  var arrayObj = [
               {"year" : 2015, "month" : "JAN", "value" : 0},
               {"year" : 2015, "month" : "FEB", "value" : 2.33},
               {"year" : 2015, "month" : "MAR", "value" : 0},
               {"year" : 2014, "month" : "JAN", "value" : 0},
               {"year" : 2014, "month" : "FEB", "value" : 0},
               {"year" : 2014, "month" : "MAR", "value" : 0}
             ];

4 个答案:

答案 0 :(得分:2)

我认为地图功能在这种情况下是理想的。请参阅以下代码段:

var src = [
           {"year" : 2015, "month" : "JAN", "value" : 0},
           {"year" : 2015, "month" : "FEB", "value" : 0},
           {"year" : 2015, "month" : "MAR", "value" : 0},
           {"year" : 2014, "month" : "JAN", "value" : 0},
           {"year" : 2014, "month" : "FEB", "value" : 0},
           {"year" : 2014, "month" : "MAR", "value" : 0}
         ];

var newRecord = {
"year": 2015,
"month": "FEB",
"value": 2.33
};

function updateJSON(src, newRecord) {
return src.map(function(item) {
  return (item.year === newRecord.year && item.month === newRecord.month) ? newRecord : item;
});
}
src = updateJSON(src, newRecord);
console.log(src);

答案 1 :(得分:1)

遍历数组,找到相关月份,并更新其值:

var newData = { "year" : 2015, "month" : "FEB", "value" : 2.33 };

for (var i = 0; i < data.length; i++) {
    var entry = data[i];

    if (entry.year == newData.year && entry.month == newData.month)
        entry.value = newData.value;
}

但是,您的结构不适合此类更新。如果您有10,000个条目,则可能需要检查所有条目以更新单个条目。

您应该按年和月组织数据。例如:

var data = {
    '2015-FEB': 2.5
    '2015-MAR': 3.8
};

更新此其他结构只需一个操作:

data[year + '-' + month] = value;

如果您需要在发布的表单中使用对象,那么您可以充分利用这两个方面:

var data = {
    '2015-FEB': { "year" : 2015, "month" : "FEB", "value" : 2.33 }
};

如果按排序顺序需要它们,则可以使用两个结构:数据的日期到对象映射,存储对相同对象的引用。< / p>

答案 2 :(得分:1)

您可以使用filter找到该对象。

var arrayObj = [{
    "year": 2015,
    "month": "JAN",
    "value": 0
}, {
    "year": 2015,
    "month": "FEB",
    "value": 0
}, {
    "year": 2015,
    "month": "MAR",
    "value": 0
}, {
    "year": 2014,
    "month": "JAN",
    "value": 0
}, {
    "year": 2014,
    "month": "FEB",
    "value": 0
}, {
    "year": 2014,
    "month": "MAR",
    "value": 0
}];

var newData = {
    "year": 2015,
    "month": "FEB",
    "value": 2.33
};

function findOneByMonthAndYear(arr, month, year) {
    return arr.filter(function(item) {
        return item.year === year && item.month === month;
    })[0];
}

var item = findOneByMonthAndYear(arrayObj, newData.month, newData.year);
item.value = newData.value;

console.log(arrayObj);

答案 3 :(得分:1)

只需从要更新的阵列中选择单元格即可。

var n= { "year" : 2015, "month" : "FEB", "value" : 2.33 };

 var arrayObj = [
               {"year" : 2015, "month" : "JAN", "value" : 0},
               {"year" : 2015, "month" : "FEB", "value" : 0},
               {"year" : 2015, "month" : "MAR", "value" : 0},
               {"year" : 2014, "month" : "JAN", "value" : 0},
               {"year" : 2014, "month" : "FEB", "value" : 0},
               {"year" : 2014, "month" : "MAR", "value" : 0}
             ];

for (var z = 0; z < arrayObj.length; z++) {
   if(arrayObj[z].year="2015" && arrayObj[z].month="FEB")
        arrayObj[z].value=n.value;
}

当然,你可以根据自己的需要使其更具活力。