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

var User = {
    local: {
    location: {
      city: "",
      state: ""
    }
  }
}

var Profile = {
    location: {
    city: "",
    state: ""
    }
}

function update(model, parameter, updatedLocation)  {
        return model[updatedLocation] = {
        city: updatedLocation.city,
      state: updatedLocation.state,
    };
}

update(User, ["local"]["location"], { city: "ny", state: "ny"});
update(Profile, ["location"], { city: "ny", state: "ny"});

console.log(User);
console.log(Profile);

JS Fiddle

0
Shivam 28 Май 2017 в 08:36

2 ответа

Лучший ответ

Вы могли бы попробовать это. По сути, это общий способ перехода на любой уровень объекта и обновления свойств. Подробности в комментариях к коду

var User = {
  local: {
    location: {
      city: "",
      state: ""
    }
  }
}

var Profile = {
  location: {
    city: "",
    state: ""
  }
}

function update(obj, path, updatedProps) {
  var objToUpdate = obj;
  // Iterate down the path to find the required object
  for (var i = 0; i < path.length; i++) {
    if (objToUpdate[path[i]]) {
      objToUpdate = objToUpdate[path[i]]
    } else {
      // If any path is not found, then no point continuing
      objToUpdate = null;
      break;
    }
  }
  if (objToUpdate) {
    var props = Object.keys(updatedProps);
    for (var j = 0; j < props.length; j++) {
      var prop = props[j];
      objToUpdate[prop] = updatedProps[prop] || objToUpdate[prop];
    }
  }
  return obj;
}

update(User, ["local", "location"], {
  city: "ny",
  state: "ny"
});
update(Profile, ["location"], {
  city: "ny",
  state: "ny"
});

console.log("User:", User);
console.log("Profile:", Profile);
1
Maaz Syed Adeeb 28 Май 2017 в 09:15

Аналогично другому ответу здесь, но он не требует явного кодирования структуры location:

function update(model, parameter, newVal) {
    model[parameter] = newVal;
}

update(User["local"], "location", { city: "ny", state: "ny"});
update(Profile, "location", { city: "ny", state: "ny"});

Или, если вы только обновляете местоположение, вы можете упростить функцию:

function updateLocation(model, newVal) {
    model.location = newVal;
}
0
Erik Koopmans 28 Май 2017 в 05:56