Ответ Павана хорош, но чтобы сделать это тестируемым в автоматических тестах:
// I would name these fields in your API
// by making the constructor take an object.
// Capitalise the name to signal that it can be newed
function Member({id, password}) {
this.id = id;
this.pwd = password
}
// Name the array for what it is
const members = [
new Member({id: "m001", password: "123"}),
new Member({id: "m002", password: "123"}),
new Member({id: "m031", password: "123"})
]
const editInBrowserFn = member => JSON.parse(window.prompt("want to edit values?", JSON.stringify(member)));
const updateMembers = editFn => array => array.map(editFn)
// To get an update
const updatedMembers = updateMembers(editInBrowserFn)(members)
console.log(updatedMembers)
// You can now test it by making an testing editFn that doesn't need user interaction
const testEditFn = m => new Member({id: m.id, password: 'test'})
const testMembers = updateMembers(testEditFn)(members)
console.log(testMembers)
Подробную информацию об этом подходе см. В этой статье .
Чтобы сделать это таким образом, вам потребуется вытащите это из глобальной области видимости. Это хорошая дисциплина для развития. В качестве первого шага вы можете сделать объект в глобальной области видимости, содержащий последний список членов:
const Members = (() => {
let _members = []
return {
setMembers: members => _members = [...members],
getMembers: () => [..._members]
}
})()
Теперь способ обновления членов выглядит следующим образом:
const updateFn = updateMembers(editInBrowser)
function updatePasswords() {
const members = Members.getMembers()
Members.setMembers(updateFn(members))
}
Ничто не может теперь случайно удалите или измените массив членов, чтобы исключить площадь поверхности ошибки.
Так устроен React setState
. Он вдохновлен идеями функционального программирования и неизменностью.
Возможно, вы захотите обновить только один элемент, поэтому:
const Members = (() => {
let _members = []
return {
setMembers: members => _members = [...members],
getMembers: () => [..._members],
updateMember: updated =>
this.members = _members.map(m =>
m.id === updated.id ? updated : m)
}
})()
Теперь все ваши изменения массива находятся в одном месте, и Вы только должны сделать это без ошибок там. В противном случае ваше глобальное состояние будет открыто, и вам придется исправлять ошибки везде, где это связано. Без этого все ваши вызывающие функции несут ответственность за правильное управление глобальным состоянием приложения. Комплекс.
Кристаллизуйте сложность в одном месте.
Я написал статью и полную реализацию магазина (в 40 строках кода) здесь .