Vextor-ltd
@Vextor-ltd
Webdeveloper

Хорошо ли собирать массив объектов путём конкатинации строк и дальнейшего применения eval()?

У меня база – backend, поэтому и интересует данный вопрос.
const arrayLabels = ['India', 'Indonesia', 'Russia', 'China', 'Bangladesh', 'Nepal', 'Bhutan', 'Myanmar', 'Laos', 'Cambodia', 'Vietnam', 'Malaysia'];
    const arrayData = [2467, 560, 540, 20, 114, 121, 103, 85, 17, 150, 20, 295];
    const arrayBackgroundColor = ['#55E6C1', '#3B3B98', '#F97F51', '#25CCF7', '#EAB543', '#CAD3C8', '#FEA47F', '#1B9CFC', '#F8EFBA', '#58B19F', '#2C3A47', '#B33771'];

    function dataSort(arrayLabels, arrayData, ...params) {
      console.log(`number of arguments: ${params.length}`);
      let arrayOfObjStr = '[';
      arrayLabels.forEach((label, i) => {
        arrayOfObjStr += `{labels: '${label}',\n` +
                          `data: '${arrayData[i] || 0}',\n`;
        params.forEach(function(param, a) {
          arrayOfObjStr += `arr${a}: '${param[i] || 0}',\n`;
        });
        arrayOfObjStr += '},\n';
      });
      arrayOfObjStr += ']';

      let arrayOfObj = eval(arrayOfObjStr).sort((a, b) => {
        return parseInt(b.data) > parseInt(a.data);
      });


    /* ... */
  }


Как-то не по джавоскриптовски этот код выглядит ))
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А что мешает сразу формировать объект без лишних преобразований строку и обратно?
function dataSort(arrayLabels, arrayData, ...params) {
  console.log(`number of arguments: ${params.length}`);
  const arrayOfObj = [];
  arrayLabels.forEach((label, i) => {
    const el = { labels: label, data: arrayData[i] || 0 };
    params.forEach(function(param, a) {
      el[`arr${a}`] = param[i] || 0;
    });
    arrayOfObj.push(el);
  });
  arrayOfObj = arrayOfObj.sort((a, b) => parseInt(b.data) > parseInt(a.data));
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
WblCHA
@WblCHA
Эвал... Зачем? То, что ты написал, нечитабельно, а уж ошибки исправлять вообще боль.

function dataSort(arrayLabels, arrayData, ...rawParams) {
    console.log(`number of arguments: ${params.length}`);
    
    const getParams = (pIndex) => rawParams.reduce((acc, p, i) => {
      acc[`arr${i}`] = p[pIndex] || '';
      return acc;
    }, {});
    
    const arrayOfObj = arrayLabels
      .map((label, i) => ({
        labels: label,
        data: arrayData[i],
        ...getParams(i),
      }))
      .sort((a, b) => b.data - a.data);
    
    /* ... */
  }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы