更新对象键值

时间:2014-03-18 11:47:38

标签: javascript

过去一小时一直试图解决这个问题,但似乎无法得到它。我正在尝试使用过去X天的日期创建一个数组。这是一个例子:

var dates = [];
var curr = new Date();
var first = curr.getDate();

dates.push(new Date(curr.getTime()).toISOString().split('T')[0]);

for(var i = 1; i < 6; i++){
    var previous = new Date(curr.getTime());
    previous.setDate(first - i);
    dates.push(previous.toISOString().split('T')[0]);
}

console.log(dates);

结果给了我:

["2014-03-18", "2014-03-17", "2014-03-16", "2014-03-15", "2014-03-14", "2014-03-13"]

我如何将这种格式用于我的图表?

   var chartData = [{day: '2014-03-18',clicks: 8,success: 4}, 
                    {day: '2014-03-17',clicks: 41,success: 3},
                    {day: '2014-03-16',clicks: 20,success: 1},
                    {day: '2014-03-15',clicks: 46,success: 3},
                    {day: '2014-03-14',clicks: 34,success: 2}];

我需要能够添加点击次数和成功,但由于可变名称是动态的,我很难过。我尝试了括号符号和点,我无法让它工作。

任何人都知道如何实现这一目标吗?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

从根本上说,要将对象放在数组而不是字符串中,可以创建对象:

dates.push({
    day: previous.toISOString().split('T')[0],
    clicks: 0,
    success: 0
});

然后更新:

++dates[someIndex].success;

dates[someIndex].clicks = 27;

你说:

  

...但由于可变名称是动态的,我很难

...但没有说出你在说什么变量。如果您指的是该属性的名称,例如clicksuccess,那没关系,您可以使用括号内的表示法和字符串:

var obj = {day: previous.toISOString().split('T')[0]};
obj[variableWithNameForClicks] = 0;
obj[variableWithNameForSuccess] = 0;
dates.push(obj);

++dates[someIndex][variableWithNameForSuccess];

dates[someIndex][variableWithNameForClicks] = 27;

这是有效的,因为在JavaScript中,您可以通过两种方式访问​​对象属性:带有文字属性名称(obj.foo)的虚线表示法,或带有字符串属性名称的括号表示法({ {1}})。在括号中表示法,字符串可以是任何表达式的结果,包括变量查找。所以:

obj["foo"]

答案 1 :(得分:0)

See the codepen here.

var dates = [];
var curr = new Date();
var first = curr.getDate();

// Using variable object property names
var dayVar = "day";
var clicksVar = "clicks";
var successVar = "success";

// Increment from 0 instead of 1 so you don't have to repeat yourself
for ( var i = 0; i < 6; i++ ){
  var dateObj = {};
  var previous = new Date(curr.getTime());

  previous.setDate(first - i);
  dateObj[dayVar] = previous.toISOString().split('T')[0];
  dateObj[clicksVar] = 0;
  dateObj[successVar] = 0;

  dates.push(dateObj);
}

// Increment clicks
dates[0][clicksVar] += 1;

// Increment success
dates[0][successVar] += 1;

console.log(dates);

如果你想回去查找特定日期的对象,可以使用像underscore这样的js库,或者你可以这样做:

// Today's date
var searchDate = new Date(curr.getTime()).toISOString().split('T')[0];

// Search through the array for the matching object
for (var i = 0; i < searchDate.length; i++) {
  var obj = dates[i];
  if ( obj.day === searchDate ) {
    console.log(obj);
    break;
  }
}