D3 Update vs New Item при использовании ключевой функции

Я пытаюсь использовать D3 для отображения некоторых данных. У меня есть массив объектов с парами ключ-значение.

let data = [{k:'kfoo',v:'vfoo'},{k:'kbar',v:'vbar'}];

function doit(somedata){
  let bod = d3.select('body');
  let rows = bod.selectAll('div.row').data(somedata, d=>d.k);
  rows.exit().remove();
  
  let newRows = rows.enter().append('div').classed('row', true);
  newRows.append('span').text(d=>d.k);
  newRows.append('span').text(' ');
  newRows.append('span').text(d=>d.v);
  
  //rows.selectAll('span:first-child').text(d=>d.k);
  rows.selectAll('span:last-child').text(d=>d.v)
}

doit(data);

setTimeout(function(){
  data[0].k = 'kfoo1';
  data[0].v = 'vfoo1';
  doit(data);
}, 3000);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

https://jsfiddle.net/dfw0m1ga/1/

Почему, когда я изменяю значение в data[0].k, я ожидал, что это приведет к тому, что d3 интерпретирует элементы 0 как новый элемент. Скорее, он интерпретирует это как обновление. Почему?

Приятно: полностью пустой jsfiddle

rioV8 17.12.2018 18:07

прочтите документацию о d3.selectAll()

rioV8 17.12.2018 18:08

Исправлена ​​ссылка на скрипт js.

Wanderer 17.12.2018 20:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
45
1

Ответы 1

Данные, которые вы изменяете, связаны, поэтому, если вы изменяете объект, связанный объект также изменяется, и ключевые функции совпадают.

Удалите первый объект и добавьте новый объект. Здесь он жестко запрограммирован, но вы можете найти метод, который подходит для ваших реальных данных приложения.

let data = [{k:'kfoo',v:'vfoo'},{k:'kbar',v:'vbar'}];

function doit(somedata){
  let bod = d3.select('body');
  let rows = bod.selectAll('div.row').data(somedata, d=>d.k);
  rows.exit().remove();
  
  let newRows = rows.enter().append('div').classed('row', true);
  newRows.append('span').text(d=>d.k);
  newRows.append('span').text(' ');
  newRows.append('span').text(d=>d.v);
  
  //rows.selectAll('span:first-child').text(d=>d.k);
  rows.selectAll('span:last-child').text(d=>d.v)
}

doit(data);

setTimeout(function(){
  data = [data[1]];
  data.push( {k:'kfoo1',v:'vfoo1'} );
  doit(data);
}, 3000);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

в течение 1 минуты после публикации ответа я уже проголосовал против ответа, который объясняет причину.

rioV8 18.12.2018 04:50

Если ключ изменился, почему d3 не видит это как новый элемент, таким образом удаляя старый элемент и добавляя новый.

Wanderer 18.12.2018 14:09

Прочтите первую строчку ответа.

rioV8 18.12.2018 15:58

Ах .... Он привязан к ссылке на объект. Не на копию ... Похоже, это сработало, как и ожидалось. jsfiddle.net/dfw0m1ga/2

Wanderer 18.12.2018 21:59

Другие вопросы по теме