Точная настройка хэша для динамического создания массива древовидной карты ZingCharts

Во-первых: спасибо, что прочитали, но здесь много всего, возможно, будет проще увидеть это в примерах CodePen, ссылки на которые приведены внизу.

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

В настоящее время древовидная карта имеет 2 «уровня», это было сделано следующим образом:

var data=[{color:"blue",party:"Democratic",text:"California",value:55},{color:"blue",party:"Democratic",text:"Oregon",value:7},{color:"red",party:"Republican",text:"Texas",value:38},{color:"red",party:"Republican",text:"Georgia",value:16},{color:"grey",party:"Democratic",text:"Arizona",value:11}];

var result = data.reduce(function(hash) {
  return function(prev, curr) {
    if (hash[curr.color]) {
      hash[curr.color].children.push({
        text: curr.text,
        value: curr.value,
        style: {
          backgroundColor: curr.color
        }
      });
    } else {
      hash[curr.color] = {};
      hash[curr.color].children = hash[curr.color].children || [];
      prev.push({
        text: curr.party,
        style: {
          backgroundColor: curr.color
        },
        children: hash[curr.color].children
      });
      hash[curr.color].children.push({
        text: curr.text,
        value: curr.value,
        style: {
          backgroundColor: curr.color
        }
      });
    }
    return prev;
  };
}(Object.create(null)), []);

Теперь я пытаюсь ввести дополнительные критерии и добавить еще один уровень. Например, в разделе «Республиканцы» и «Демократы» у вас будут подкатегории «Вероятно», «Склонность» и «Чаевые», но для «Подбрасывания» у вас не будет ни одной из них.

Вот конечный результат, который я пытаюсь сделать:

  series: [{
      text: "Democratic", 
      style: { "backgroundColor": "blue" },
      children: [{ 
        text: "Likely",
        style: { "backgroundColor": "darkblue" },
        children: [{
          text: "Alabama",
          value: 8,
          style: { "backgroundColor": "darkblue" },
        }, {
          text: "New Mexico",
          value: 14,
          style: { "backgroundColor": "darkblue" },
        }]
      }, {
        text: "Leaning",
        style: { "backgroundColor": "blue" },
        children: [{
          text: "Florida",
          value: 9,
          style: { "backgroundColor": "blue" },
        }, {
          text: "North Carolina",
          value: 6,
          style: { "backgroundColor": "blue" },
        }]
      }, {
        text: "Tipping",
        style: { "backgroundColor": "lightblue" },
        children: [{
          text: "Utah",
          value: 4,
          style: { "backgroundColor": "lightblue" },
        }, {
          text: "Idaho",
          value: 5,
          style: { "backgroundColor": "lightblue" },
        }]
      }]
    },

    { text: "Republican",
      style: { "backgroundColor": "red" },
      children: [{
        text: "Likely",
        style: { "backgroundColor": "darkred" },
        children: [{
          text: "alabama",
          value: 13,
          style: { "backgroundColor": "darkred" },
        }, {
          text: "New Mexico",
          value: 14,
          style: { "backgroundColor": "darkred" },
        }]
      }, {
        text: "Leaning",
        style: { "backgroundColor": "red" },
        children: [{
          text: "Florida",
          value: 9,
          style: { "backgroundColor": "red" },
        }, {
          text: "North Carolina",
          value: 6,
          style: { "backgroundColor": "red" },
        }]
      }, {
        text: "Tipping",
        style: { "backgroundColor": "lightred" },
        children: [{
          text: "Utah",
          value: 27,
          style: { "backgroundColor": "lightred" },
        }, {
          text: "Idaho",
          value: 12,
          style: { "backgroundColor": "lightred" },
        }]
      }]
    }, {
      text: "Toss Up",
      style: { "backgroundColor": "grey" },
      children: [{
          text: "alabama",
          value: 10,
          style: { "backgroundColor": "grey" },
        }, {
          text: "New Mexico",
          value: 14,
          style: { "backgroundColor": "grey" },
      }]
    },
  ]
};

Я пытался выяснить, как изменить пример, который мне дали для этого, но терпел неудачу в течение нескольких часов. Я не уверен, что я должен искать. Я думаю, что в операторе Else внутри «prev.push» (строка 2040 здесь) корректировка должна происходить, но я не знаю, как ее реализовать, я также подозреваю, что мне нужно изменить весь подход.

var result = data.reduce(function(hash) {
  return function(prev, curr) {
    if (hash[curr.party]) { 
      console.log("if: " + curr.party + " " + curr.category);
      hash[curr.party].children.push({ 
        text: curr.text,
        value: curr.value,
        style: {
          backgroundColor: curr.color
        }
      });
    }

    else { 
      console.log("else: " + curr.party + " " + curr.category);
      hash[curr.party] = {};
      hash[curr.party].children = hash[curr.party].children || [];

      hash[curr.party].children.push({
        text: curr.text,
        value: curr.value,
        style: {
          backgroundColor: curr.color
        }
      });

      prev.push({
        text: curr.party,
        style: {
          backgroundColor: curr.color
        },
        children: hash[curr.party].children // children: [{ text: curr.category, children: [{ }] }]
      });

      hash[curr.category] = {};
      hash[curr.category].children = hash[curr.category].children || [];
      console.log("category");
      prev.push({
        text: curr.category,
        style: {
          backgroundColor: curr.color
        },
        children: hash[curr.category].children
      });
    }
    return prev;
  };
}(Object.create(null)), []);

Упаковать:

  1. Вот CodePen базовой структуры цели
  2. Вот мой текущий код

person Neal Jones    schedule 01.11.2016    source источник


Ответы (1)


Раньше классификация производилась на основе color, судя по вашим данным, я думаю, теперь мы можем сделать это на основе party. Поскольку к дереву добавлен еще один уровень, мы можем классифицировать его на основе category.

Итак, изменений много — см. демо ниже:

var data = [{"text":"California","value":55,"color":"#000066","party":"Democratic","compare":1,"category":"Likely"},{"text":"Connecticut","value":7,"color":"#000066","party":"Democratic","compare":1,"category":"Likely"},{"text":"Colorado","value":9,"color":"#3333CC","party":"Democratic","compare":2,"category":"Leaning"},{"text":"Florida","value":29,"color":"#9999FF","party":"Democratic","compare":3,"category":"Tipping"},{"text":"Iowa","value":6,"color":"red","party":"Republican","compare":4,"category":"Likely"},{"text":"Alabama","value":9,"color":"#CC3333","party":"Republican","compare":5,"category":"Leaning"},{"text":"Alaska","value":3,"color":"#FF9999","party":"Republican","compare":6,"category":"Tipping"},{"text":"Arizona","value":11,"color":"#666666","party":"Toss-Up","compare":7,"category":"Toss Up"},{"text":"Texas","value":11,"color":"#666666","party":"Toss-Up","compare":7,"category":"Toss Up"}];

var result = data.reduce(function(hash) {
  return function(prev, curr) {
    if (!hash[curr.party]) {
      hash[curr.party] = {};
      hash[curr.party].children = hash[curr.party].children || [];
      prev.push({
        text: curr.party,
        style: {
          backgroundColor: curr.color
        },
        children: hash[curr.party].children
      });
    } else if (hash[curr.party] && hash[curr.party][curr.category]) {
      hash[curr.party][curr.category].children.push({
        text: curr.text,
        value: curr.value,
        style: {
          backgroundColor: curr.color
        }
      });
    }

    if (hash[curr.party] && !hash[curr.party][curr.category]) {
      if (curr.category == "Toss Up") {
        hash[curr.party].children.push({
          text: curr.text,
          value: curr.value,
          style: {
            backgroundColor: curr.color
          }
        });
      } else {
        hash[curr.party][curr.category] = {};
        hash[curr.party][curr.category].children = hash[curr.party][curr.category].children || [];
        hash[curr.party].children.push({
          text: curr.category,
          style: {
            backgroundColor: curr.color
          },
          children: hash[curr.party][curr.category].children
        });
        hash[curr.party][curr.category].children.push({
          text: curr.text,
          value: curr.value,
          style: {
            backgroundColor: curr.color
          }
        });
      }
    }
    return prev;
  };
}(Object.create(null)), []);

console.log(result);
.as-console-wrapper {top: 0;max-height: 100%!important;}

person kukkuz    schedule 02.11.2016
comment
Спасибо! Я очень ценю, что вы помогли мне дважды, я просто попробовал еще раз после возвращения домой, я собираюсь попробовать и дам вам знать! - person Neal Jones; 02.11.2016
comment
Итак, все работает отлично с моими полными тестовыми данными, за исключением Toss Up. Проблема в том, что Toss Up никогда не содержит дочерних элементов «Вероятно/Наклонение/Опрокидывание». На этом рисунке вы можете видеть, что прямо сейчас он все еще выполняет второй уровень Toss Up (i.imgur.com /dUJRKM7.png). Кроме того, я поместил этот новый CodePen вместе с моими полными тестовыми данными, чтобы вы могли их увидеть: codepen .io/anon/pen/jMgoJa?editors=0010 Еще раз спасибо! - person Neal Jones; 02.11.2016
comment
@NealJones добавил условие для удаления дополнительного уровня для Toss up... дайте мне знать, если это решит проблему, спасибо! - person kukkuz; 02.11.2016