Где истинное значение для троичного оператора для выполнения в этом коде? - PullRequest
0 голосов
/ 10 ноября 2019

Некоторый фон для этой проблемы кодирования. Наша функция termTopics должна подсчитать, сколько раз каждая из этих тем упоминалась в опросах, а затем вернуть массив с количеством упоминаний в следующем порядке: умный город, финансирование искусства, а затем транспорт.

const termTopics = (interviews) => {
  const count = interviews.reduce((acc, cv) => {
    return {...acc, [cv]: acc[cv] ? acc[cv]+1 : 1}
  }, {})
  return [count['smart city'], count['arts funding'], count['transportation']];
}

Что я не могу понять, так это оператор распространения и то, как он создает правдивое утверждение для троичного оператора для работы.

Ответы [ 3 ]

1 голос
/ 10 ноября 2019
const count = interviews
  .reduce((resultObject, interview) => {
    // We are creating an object through the reduce function by iterating through the interviews array.
    // At each iteration we will modify the result object according to the current array interview item value
    return {
      // First we copy the object we have so far
      ...resultObject,
      // Then we set the property corresponding to the current item 
      [interview]: resultObject[interview] 
        // If it is not the first time we have seen this item, the object property already exists and we update it by adding one to its value
        ? resultObject[interview] + 1 
         // Otherwise we create a new property and set it to one
        : 1
    }
  }, {})
0 голосов
/ 10 ноября 2019

Синтаксис распространения и условный оператор здесь совершенно не связаны. Развернемся здесь и далее:

  1. Полное выражение условного оператора равно acc[cv] ? acc[cv]+1 : 1, поэтому оно разрешится до acc[cv]+1 или 1 в зависимости от того, является ли acc[cv] правдивым илиnot.
  2. Результат условного оператора присваивается свойству объекта.
  3. Имя свойства [cv] - вычисляемое имя свойства , которое будет равнотекущее значение cv.
  4. Имя и значение свойства добавляются к объекту.
  5. Остальные значения объекта являются ...acc или текущими значениями объекта, которые являются распространяется на объект .

По сути, {...acc, [cv]: acc[cv] ? acc[cv]+1 : 1} является более короткой версией следующего кода ES5:

var result = {};

//{...acc}
for (var key in acc) {
  result[key] = acc[key];
}

//[cv]: acc[cv] ? acc[cv]+1 : 1
if (acc[cv]) {
  result[cv] = acc[cv]+1;
} else {
  result[cv] = 1;
}
0 голосов
/ 10 ноября 2019

Истинное (или ложное) значение исходит отсюда: acc[cv] и, если есть значение, вы увеличиваете его на единицу, в противном случае вы устанавливаете его на единицу.

acc[cv] - это вычисленное свойство и будет искать значение cv как свойство acc, например, acc['smart city'].

...