2016-11-03 2 views
0

Например, мне нужно определить вариант, как это:Как повторно использовать часть структуры данных?

option = { 
    series: [{ 
     name:'Others', 
     type: 'line', 
     data: [23.9627, 26.4315, 29.917, 27.5934, 26.8672], 
     symbol: 'none', 
     itemStyle: { 
      normal: { 
       color: 'rgb(165,165,165)' 
      } 
     }, 
     lineStyle: { 
      normal: { 
       width: 5, 
      } 
     } 
    }, { 
     name:'Apple', 
     type: 'line', 
     data: [18.1535, 18.5892, 13.9419, 22.9461, 23.9627], 
     symbol: 'none', 
     itemStyle: { 
      normal: { 
       color: 'rgb(165,165,165)' 
      } 
     }, 
     lineStyle: { 
      normal: { 
       width: 5, 
      } 
     } 
    },{ 
     name:'HTC', 
     type: 'line', 
     data: [8.7137, 10.4564, 10.166, 6.2448, 4.6473], 
     symbol: 'none', 
     itemStyle: { 
      normal: { 
       color: 'rgb(165,165,165)' 
      } 
     }, 
     lineStyle: { 
      normal: { 
       width: 5, 
      } 
     } 
    }] 
}; 

Проблема заключается в том, что

symbol: 'none', 
     itemStyle: { 
      normal: { 
       color: 'rgb(165,165,165)' 
      } 
     }, 
     lineStyle: { 
      normal: { 
       width: 5, 
      } 
     } 

является одинаковым для всех серий и повторяется 3 раза.

Я хочу знать, можно ли его извлечь и сделать что-то вроде этого?

defaullt_line_option ={ 
    symbol: 'none', 
    itemStyle: { 
     normal: { 
      color: 'rgb(165,165,165)' 
     } 
    }, 
    lineStyle: { 
     normal: { 
      width: 5, 
     } 
    } 
}; 

option = { 
    series: [{ 
     name:'Others', 
     type: 'line', 
     data: [23.9627, 26.4315, 29.917, 27.5934, 26.8672], 
     default_line_style, 
    }, { 
     name:'Apple', 
     type: 'line', 
     data: [18.1535, 18.5892, 13.9419, 22.9461, 23.9627], 
     default_line_style, 
    },{ 
     name:'HTC', 
     type: 'line', 
     data: [8.7137, 10.4564, 10.166, 6.2448, 4.6473], 
     default_line_style 
    }] 
}; 

Update:

Что делать, если я просто хочу поделиться с ней только 2 серии, не все из них? Как мне это сделать?

+0

Вы попробовали? Что ты получил? В чем проблема? – Dekel

+0

@Dekel проблема в том, что вы не можете просто передать 'default_line_style' вот так ... – cqcn1991

ответ

2

Да, вы можете это сделать:

var default_line_option = { 
    symbol: 'none', 
    itemStyle: { 
     normal: { 
      color: 'rgb(165,165,165)' 
     } 
    }, 
    lineStyle: { 
     normal: { 
      width: 5, 
     } 
    } 
}; 

var option = { 
    series: [{ 
     name:'Others', 
     type: 'line', 
     data: [23.9627, 26.4315, 29.917, 27.5934, 26.8672], 
     use_default_line_option: true 
    }, { 
     name:'Apple', 
     type: 'line', 
     data: [18.1535, 18.5892, 13.9419, 22.9461, 23.9627], 
     use_default_line_option: true 
    },{ 
     name:'HTC', 
     type: 'line', 
     data: [8.7137, 10.4564, 10.166, 6.2448, 4.6473], 
     use_default_line_option: false 
    }] 
}; 

option.series = option.series.map(function(el) { 
    // Add default options if needed 
    if (el.use_default_line_option) { 
    for (var attr in default_line_option) { el[attr] = default_line_option[attr]; } 
    } 
    // Remove use_default_line_option attributes 
    delete el.use_default_line_option; 
    return el; 
}); 

JSFIDDLE

EDIT:

  • используя map функцию, чтобы получить "одну линию" решение
  • use_default_line_option булево к используйте опцию по умолчанию или нет
+0

Думаю, я могу это сделать, но я просто хочу сделать это с помощью одного лайнера .... – cqcn1991

+0

@ cqcn1991 Я редактировал ma ответьте на использование функции «map» и добавили логическое значение для использования или не по умолчанию. – Finrod

1

Вы создаете свой резервный JSON, а затем просто применяете к нему небольшую логику для достижения того, чего хотите.

defaullt_line_option ={ 
 
    symbol: 'none', 
 
    itemStyle: { 
 
     normal: { 
 
      color: 'rgb(165,165,165)' 
 
     } 
 
    }, 
 
    lineStyle: { 
 
     normal: { 
 
      width: 5, 
 
     } 
 
    } 
 
}; 
 

 
option = { 
 
    series: [{ 
 
     name:'Others', 
 
     type: 'line', 
 
     data: [23.9627, 26.4315, 29.917, 27.5934, 26.8672], 
 
     apply:true 
 
    }, { 
 
     name:'Apple', 
 
     type: 'line', 
 
     data: [18.1535, 18.5892, 13.9419, 22.9461, 23.9627], 
 
     apply:true 
 
    },{ 
 
     name:'HTC', 
 
     type: 'line', 
 
     data: [8.7137, 10.4564, 10.166, 6.2448, 4.6473] 
 
    }] 
 
}; 
 

 

 

 
option.series = option.series.map(function(el){ 
 
    var apply = el.hasOwnProperty("apply") && el.apply; 
 
    delete el.apply; 
 
    if(!apply) 
 
     return el; 
 

 
    for (var attrname in defaullt_line_option) { el[attrname] = defaullt_line_option[attrname]; } 
 
    
 
    return el; 
 
}); 
 

 
console.log(option);

UPDATE:

У меня есть apply ключ теперь, если он присутствует, и это верно, то будет получить применяется только по умолчанию, в противном случае они не будут. Не забывайте правильно удалить его потом.

+0

Это круто. Тогда как я могу применить его только к 2 из 3-х серий? – cqcn1991

+0

@ cqcn1991 проверить обновленный ответ. – void

1

Да, вы можете иметь стандартные опции, которые вы добавляете в:

var standardOptions = { 
    symbol: 'none', 
    itemStyle: { 
     normal: { 
      color: 'rgb(165,165,165)' 
     } 
    }, 
    lineStyle: { 
     normal: { 
      width: 5, 
      } 
    } 
}; 

А потом просто добавить их в простой петле:

option.series.forEach(function(entry) { 
    for (var name in standardOptions) { 
     entry[name] = standardOptions[name]; 
    } 
}); 

Обратите внимание, что это означает, что lineStyle и itemStyle объекты будут различных series записей.

+0

Но, может быть, я просто хочу установить параметр по умолчанию для 2 из 3 строк, вместо этого все они? – cqcn1991

+0

@ cqcn1991: В цикле вы можете проверить, имеет ли 'entry' уже имя' name' и не устанавливает его, если он делает ('if (! (Name in entry)) {...}'). –

Смежные вопросы