Аргумент типа не может быть назначен на строку - PullRequest
1 голос
/ 23 декабря 2019

У меня есть отформатированные данные json, которые я хочу использовать в d3 для построения иерархии. Он работал со старыми данными, но после добавления большего измерения в данные json выдает следующую ошибку.

Аргумент типа '{name: string;дети: {группа: номер;имя: строка;} [];группа: номер;} [] 'нельзя назначить параметру типа' readonly string [] '. Тип '{имя: строка;дети: {группа: номер;имя: строка;} [];группа: номер;} 'нельзя присвоить типу' string '.

Вывод моих переформатированных данных следующий, который генерируется с использованием кода из ответа @Dacre Denny из Изменение данных Json в новый формат с помощью JavaScript ссылка

{
  name: "program",
  children: (1)[
    {
      name: "file1",
      children: (1)[
        {
          name: "function1",
          calls: (2)[
            {
              line: 105,
              file: "file2",
              function: "function5"
            },
            {
              line: 106,
              file: "file2",
              function: "function6"
            }
          ],
          point: (2)[
            102,
            105
          ],
          point2: (3)[
            (2)[
              102,
              102
            ],
            (3)[
              105,
              106,
              107
            ],
            (2)[
              106,
              107
            ]
          ],
          group: 1
        }
      ],
      group: 1
    }
  ],
  group: 0
}

Мой фрагмент кода для d3 выглядит следующим образом:

const data = TestFunction.test(); //from here i am calling the reformatted output
const root = d3.hierarchy(data);

const colorScale = d3.scaleOrdinal()
        .domain(data.children) // here its showing the error.
        .range(d3.schemeCategory10);

Буду очень признателен за вашу помощь.

1 Ответ

1 голос
/ 23 декабря 2019

Вы не можете передать вложенный массив в ordinal.domain(): порядковый масштаб должен иметь массив plain в качестве домена ... еще более важно, массив значений ,т.е. примитивы, такие как строки (если вы передадите числа, они все равно будут заштрихованы ...). Это объясняет вашу ошибку: «Аргумент типа не может быть назначен на string » .

При этом вы можете использовать root.descendants(), чтобы получить всех детей, и map, чтобы получить их нужные свойства. В вашем случае я предполагаю, что нужная вам строка - это свойство name детей.

В этой демонстрации myNames - это массив, который вы передадите в порядковый масштаб (если вам не нужно имя корня, удалите его):

const data = {
  "name": "program",
  "children": [{
    "name": "file1",
    "children": [{
      "name": "function1",
      "calls": [{
          "line": 105,
          "file": "file2",
          "function": "function5"
        },
        {
          "line": 106,
          "file": "file2",
          "function": "function6"
        }
      ],
      "lines1": [
        102,
        105
      ],
      "lines2": [
        [
          102,
          102
        ],
        [
          105,
          106,
          107
        ],
        [
          106,
          107
        ]
      ],
      "group": 1
    }],
    "group": 1
  }],
  "group": 0
};

const root = d3.hierarchy(data);

const myNames = root.descendants().map(d => d.data.name);

console.log(myNames)
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...