Если / Остальное в .map функция реагирует

Но это кажется неудобным, и я не знаю, почему он даже работает, поскольку мои аргументы вызова emit в моем картографе не эквивалентны возвращаемому аргументу моего reducer.

Они эквивалентны. Функция уменьшения принимает в массив значения T и должна возвращать одно значение в том же формате T. Формат T определяется вашей функцией отображения. Функция сокращения просто возвращает первый элемент в массиве значений, который всегда будет иметь тип T. Вот почему он работает:)

Кажется, что вы на правильном пути. Я экспериментировал, и, похоже, вы не можете сделать db.collection.save() из функции карты, но вы можете сделать это из функции уменьшения. Ваша функция карты должна просто создать необходимый формат документа:

function map() {
  emit(this._id, { _id: this.id, heading: this.title, body: this.content });
}

Функция карты повторно использует идентификатор исходного документа. Это должно предотвратить любые шаги повторного уменьшения, поскольку никакие значения не будут использовать один и тот же ключ.

Функция уменьшения может просто вернуть null. Но, кроме того, вы можете записать значение в отдельную коллекцию.

function reduce(key, values) {
  db.result.save(values[0]);

  return null;
}

Теперь db.result должен содержать преобразованные документы без каких-либо дополнительных шумов, уменьшающих размер карты, которые вы имели бы во временной коллекции. Я на самом деле не тестировал это на больших объемах данных, но этот подход должен использовать преимущества параллельного выполнения функций уменьшения карты.

0
задан Adu Adrian 5 March 2019 в 15:31
поделиться

2 ответа

Проблема в том, что вы пытаетесь сделать if / else на карте массива. Но если в массиве нет элементов, то отображать нечего.

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

{ results && result.length ? 
    <List className="search-results">
            {
                results.map((artist) => {
                    return ( 
                    <ListItem button key={artist.name} className="result" onClick={() => this.onResultClick(artist)} >
                        <ListItemAvatar>
                            <Avatar src={artist.avatar} alt={artist.name} />
                        </ListItemAvatar>
                        <ListItemText primary={artist.name} />
                        <Button
                            variant="outlined"
                            color="secondary"
                            size="small"
                            className="add-button"
                        >
                            Add to favorites
                        </Button>
                    </ListItem>
                    );
                })
            }
    </List>
    : <div>No Results</div>
}

Здесь мы проверяем, считается ли results.length правдивым или нет 1 или выше, тогда он будет отображать ваш список, в противном случае он будет отображать наш div, информирующий пользователя, что результатов нет, и вы можете изменить его на любой, какой захотите.

0
ответ дан OllysCoding 5 March 2019 в 15:31
поделиться

У тебя там ошибка. Это .map(result: any, index: number, original: []), так что вы ссылаетесь на порядковый номер с аргументом results:

results.map((artist, results) => {
  if(results.length === 0) { ... }
});

Так что исправьте это, просто не ссылаясь на results в качестве аргумента .map

0
ответ дан zvona 5 March 2019 в 15:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: