Comments 9
Есть ещё один пункт — это опасно. Библиотека, считая входящие данные чистой функцией может запросто на одном значении вызвать их два раза. И вы никогда не знаете когда это внезапно произойдёт.
Можно при возникновении ошибки валидации (andrew: null) заменять его на дефолтное значение (andrew: ["+99999999"]), это норм для практики некритичной отказоустойчивости. А ошибки эти ловить генератором, который будет работать по while(!checkPhoneBook(obj))
, это уже просто в качестве упражнения
Так работают transformers в zod
Вы взяли библиотеку валидации, добавили очень странный сайд-эффект в виде складывания в массив. Потом сказали, что это плохо (кто бы мог подумать).
И в завершении вместо этого метода сделали другой, уже без валидации, который перекладывает номера в массив (без валидации, повторю).
Какой вывод можно сделать?
Возникла идея использовать библиотеку валидации для декларативного описания стратегии итерации по вложений структуре данных объекту.
Эта идея меня позабавила. Я хотел такой идеей поделиться. Об этом и статья
А так как эта идея обладает отрицательными качествами, я решил о них написать, чтобы не возникло ощущения что я предлагаю использовать валидации для итерации в «серьезном» коде.
Да, действительно, хорошее решение. Я не против такого решения.
Могу отметить три различия: поддержка браузеров, производительность и читаемость.
Поддержка браузеров:
Object.keys + for-of
: 94%
Object.values+.flat()
: 91%
Производительность на входных данных из статьи на Node v12:
Внимание: бенчмарк на единственных входных данных на единственной версии интерпретатора JS. Не делайте решающих выводов на основании только этого бенчмарка
keys + for-of x 7,210,543 ops/sec ±2.47% (85 runs sampled)
values + flat x 747,610 ops/sec ±0.82% (91 runs sampled)
Fastest is keys + for-of
(Чем больше ops/sec тем лучше)
const Benchmark = require("benchmark");
const suite = new Benchmark.Suite();
const phoneBook = {
andrew: ["+345356245254", "+313232312312"],
vasilina: ["+132313123123"],
serhiy: ["+587234878234", "+321323124123"],
};
suite
.add("keys + for-of", function () {
const phoneNumbers = [];
const personNames = Object.keys(phoneBook);
for (const personName of personNames) {
const personPhoneNumbers = phoneBook[personName];
phoneNumbers.push(...personPhoneNumbers);
}
return phoneNumbers;
})
.add("values + flat", function () {
return Object.values(phoneBook).flat();
})
.on("cycle", function (event) {
console.log(String(event.target));
})
.on("complete", function () {
console.log("Fastest is " + this.filter("fastest").map("name"));
})
.run({ async: true });
Читаемость вашего варианта очень хороша.
В виду этих различий я бы рассматривал насколько каждое из них важнее в вашем случае.
На мой взгляд читаемость важнее. Так что мой голос идёт в сторону Object.values(phoneBook).flat()
Странные применения валидации