2014-03-18 5 views
0

Пробовал выяснять это в течение прошедшего часа, но, похоже, не может его получить. Я пытаюсь создать массив с датами последних 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}]; 

Мне нужно, чтобы иметь возможность добавлять клики и успех, а также, но так как имя Названия переменного динамическое Я с трудом. Я попытался скопировать нотации вместе с точками, и я не могу заставить его работать.

Кто-нибудь знает, как бы я этого достиг?

Спасибо заранее!

+0

* "... но так как имя переменной является динамическим, мне тяжело." * Какое имя переменной? –

+0

Вы только нажимаете даты на массив даты, где указаны данные щелчков и успех? – frikinside

+0

Дата (день). Я хочу добавить клики и успех к текущему дню – user3432904

ответ

1

Фундаментально, чтобы поместить объект в массиве, а не строку, вы создаете объект:

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

Тогда позже обновить:

++dates[someIndex].success; 

или

dates[someIndex].clicks = 27; 

Вы сказали:

... но так как имя Названия переменного динамическое Я с трудом

... но не сказать, что переменные вы говорите. Если вы имеете в виду имя свойства, как click или success, это нормально, вы можете использовать квадратные скобки обозначения и строку:

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) или записью в квадратных скобках с помощью строка название объекта (obj["foo"]). В заключенной в квадратные скобки нотации строка может быть результатом любого выражения, включая переменный поиск. Итак:

var obj = {clicks: 27}; 
var str = "clicks"; 
console.log(obj[str]); // 27 
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); 

Если вы хотите, чтобы вернуться и найти объект для определенной даты, вы можете использовать библиотеку JS, как underscore, или вы могли бы сделать что-то вроде этого:

// 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; 
    } 
} 
Смежные вопросы