Вы можете уменьшить сложность, сохраняя слова на карте, а затем перебирая карту в конце. Это экономит повторение результата для каждого слова
Старый массив сложности O(N * M * R)
* слово в каждой группе * результат Новая сложность O(N*M + R)
большое время выполнения. Для каждого concat создается новый объект, а существующие и новые значения копируются в этот новый объект и возвращаются. Вот почему старые массивы не модифицируются. Таким образом, значения читаются снова и снова.
var array = [["a", "b"],["c", "d"],["b", "d"],["c", "a", "b"], ["a", "b", "c", "d"]];
var resultMap = {};
array.forEach(function (keywords) {
keywords.forEach(function(word, i){
if(resultMap[word]) {
resultMap[word].frequency = resultMap[word].frequency + 1;
}
else{
resultMap[word] = {
keyword: word,
frequency: 1
};
}
});
});
console.log(Object.values(resultMap));
Во-первых, причина этой проблемы: Стандарт C++ [over.ics.rank]/2.1
1 определяет порядок на последовательности преобразования. Это говорит, что определяемая пользователем последовательность преобразования хуже, чем стандартная последовательность преобразования. То, что происходит в Вашем случае, - то, что строковый литерал подвергается булеву преобразованию (определенный в 4.12
. Это - стандартное преобразование). Это не использует определяемое пользователем преобразование в std::wstring
который был бы необходим, если бы это взяло другую перегрузку.
Я рекомендовал бы просто изменить имя одной из перегрузок или добавления перегрузки, которая принимает строковый литерал непосредственно (использующий тип параметра wchar_t const*
).
1)
При сравнении канонических форм неявных последовательностей преобразования (как определено в
[over.best.ics]
)(2.1) стандартная последовательность преобразования является лучшей последовательностью преобразования, чем пользовательская последовательность преобразования или последовательность преобразования замещающего знака, и
(2.2) пользовательская последовательность преобразования является лучшей последовательностью преобразования, чем последовательность преобразования замещающего знака.
L"" указатель на строку широкого символа. Компилятор полагает, что преобразование в bool имеет приоритет по преобразованию в станд.:: wstring.
Для решения проблемы представьте новый setValue:
void setValue(std::wstring const& name, const wchar_t * value);
Так как bool является встроенным типом, преобразование от wchar_t до bool предпочтено. Я сказал бы, что простое решение состоит в том, чтобы добавить перегрузку, которая берет массив wchar_t и бросок явно там:
setValue( const std::wstring& name, const wchar_t s[] )
{
setValue(name, wstring(s));
}
Упростить немного, следующий код
#include <iostream>
using namespace std;
void f(const string &s)
{ cout << "string version called" << endl; }
void f(const bool &b)
{ cout << "bool version called" << endl; }
int main()
{ f("Hello World"); }
печать "bool названная версия". Вы уверены, что Ваш код перестал работать только с пустой строкой?
Вы могли сделать новое функциональное взятие некоторым другим типом, чем bool - возможно, просто прокси для bool - который не конвертируем от литеральной строки. Но действительно я просто переименовал бы функцию bool-взятия и был бы сделан с нею.