2017-02-06 3 views
1

Это часть кода из https://bl.ocks.org/mbostock/4183330Пытаясь понять .some() в JavaScript

Я пытаюсь понять, как names.some(function(d)...}) работы.

  1. Не следует анонимная функция, переданная в .some() вернуться условное заявление, что «» может стран всего сопоставляться?

  2. Когда будет names.some(..) вернуть true или false?

  3. Почему не d.name = n.name создать "имя" в "странах" без "возврата"?

queue() 
    .defer(d3.json, "world-110m.json") 
    .defer(d3.tsv, "world-country-names.tsv") 
    .await(ready); 

function ready(error, world, names) { 
    var countries = topojson.feature(world,world.objects.countries).features 
    countries = countries.filter(function(d) { 
     return names.some(function(n) { 
        if (d.id == n.id) return d.name = n.name; 
    }); 
}) 

ответ

3

1) Так как он использует names.some(), функция тестирует каждый элемент names, а не countries.

2) Если какое-либо из имен имеет id, которое соответствует d.id и n.name не является пустым.

3) Он всегда будет создавать свойство. Но если нет return, .some() не получает значение истины, которое он может оценить.

Это, вероятно, будет легче понять, если бы они написали:

return names.some(function(n) { 
    if (d.id == n.id) { 
     d.name = n.name; 
     return d.name; 
    } else { 
     return false; 
    } 
}); 

return d.name = n.name; сочетает в себе назначение и возвращаемое значение в одном операторе. И код использует тот факт, что функции неявно возвращают undefined, когда они не выполняют оператор return, а undefined является ложным.

+0

Благодарим вас за разъяснения. Я немного смущен, так как код внутри .some() не имеет явного выражения «return true». Итак, возврат переменной (d.name) также означает true? По какой теме я должен изучить эту концепцию? – user3562812

+1

Это просто волнует, если значение * правдиво *. Любая непустая строка является правдой. – Barmar

+0

См. Http://stackoverflow.com/questions/35642809/understanding-javascript-truthy-and-falsy – Barmar