Javascript - функция для обновления объекта prop - PullRequest
0 голосов
/ 25 октября 2019

Я хотел бы иметь функцию для обновления элемента prop. Примерно так

function updateElement(element, propName, value){
    element[propName] = value;
}

и выполнение будет выглядеть так:

updateElement(item, "name", "foo")

И это работает, но я хочу передать propName как функцию, чтобы избежать строки: что-то вроде этого:

updateElement(item, x => x.name, "foo");

Но я не уверен, как реализация этого должна выглядеть как у меня, у меня что-то подобное, но оно не работает

function updateElement(element, mapFn, value){
    mapFn(element) = value;
}

Можете ли вы помочь мне?

Edit Я хотел бы иметь более общее решение, и я хочу избежать жестко закодированных строк, например, у меня есть:

let item = {name: 'foo', address: {...}, ...};

Я хотел бы вызвать мою функцию следующим образом:

updateElement(item, x => x.name, "foo") <- it will update name, or


updateElement(item, x => x.address, newAddress) <- it will change prop of address

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Это расширение моего комментария, но вы можете использовать обратный вызов с подписью:

(объект: объект, значение: любой) => // Делать вещи

Ниже приведена реализация функции, которая проверяет и устанавливает значения для предопределенных свойств.

Идея:

  • Создание функций-оболочек, которые принимают обратные вызовы и возвращают функцию обработки.
  • Функция обработки определяет поведение независимо от объекта.
  • Вы можете вызвать эту функцию для любого объекта и ожидать того же побочного эффекта.

Преимущество этого подхода, вы можете создать универсальную функцию проверки и установки.

function updateElement(setCallback, validateCallback) {
  return function setValue(object, value) {
    if(!validateCallback || validateCallback(value)) {
      setCallback(object, value)
    } else {
      console.log("Error: Passed value is incorrect");
    }
  }
}

const dummy = {};

const setNameFn = updateElement((context, value) => context.name = value)
const setAgeFn = updateElement((context, value) => context.age = value, (value) => !isNaN(value));

setNameFn(dummy, 'foo');
setAgeFn(dummy, 'bla')
setAgeFn(dummy, 20);

console.log(dummy);
0 голосов
/ 25 октября 2019

То, что вы хотите, не возможно. x => x.name прочитает значение x.name и вернет его. В JS невозможно получить что-то вроде ссылки или указателя на одно свойство, чтобы изменить его значение. Возможно, вы могли бы что-то сделать с дескрипторами свойств, но это не будет проще, чем просто присвоить свойство.

Давайте рассмотрим ваши примеры:

updateElement(item, x => x.name, "foo") // <- it will update name, or
updateElement(item, x => x.address, newAddress) // <- it will change prop of address

Это много кода иперенаправление просто для выполнения

item.name = "foo"
item.address = newAddress

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

0 голосов
/ 25 октября 2019

Может быть, передать функцию, которая возвращает имя?

function returnName(){
  return "name";
}

Затем вы можете использовать функцию, чтобы вернуть имя и делать с ним что хотите:

function passFunction(func){
  console.log(func());
}
passFunction(returnName);

Нопочему вы передаете функцию для получения строки? Вы можете использовать объект, в котором есть строка, и передать объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...