Но это кажется неудобным, и я не знаю, почему он даже работает, поскольку мои аргументы вызова
blockquote>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
должен содержать преобразованные документы без каких-либо дополнительных шумов, уменьшающих размер карты, которые вы имели бы во временной коллекции. Я на самом деле не тестировал это на больших объемах данных, но этот подход должен использовать преимущества параллельного выполнения функций уменьшения карты.
Проблема в том, что вы пытаетесь сделать 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
, информирующий пользователя, что результатов нет, и вы можете изменить его на любой, какой захотите.
У тебя там ошибка. Это .map(result: any, index: number, original: [])
, так что вы ссылаетесь на порядковый номер с аргументом results
:
results.map((artist, results) => {
if(results.length === 0) { ... }
});
Так что исправьте это, просто не ссылаясь на results
в качестве аргумента .map