#javascript
#javascript
Вопрос:
У меня есть ниже макет данных, основанных на свойстве объекта, необходимо обновить их соответствующее значение с помощью оператора распространения. Я не могу этого сделать, потому что он вложенный.
Я могу достичь этого, используя приведенный ниже подход, но, как вы можете видеть, строка кода увеличивается. Но мы определенно можем уменьшить использование оператора распространения. Поскольку в свойстве «title» я обновляю только индекс 0, а в левом столбце обновляется только значение метки, остальное остается тем же.
const mockData = {
title: ["Javascript", "Selected Topic"],
leftColumn: [
{
key: "name",
label: "Javascript Topic Name",
type: "string",
},
{
key: "id",
label: "Javasctipt Topic Id",
type: "string",
},
],
};
const handleType = (val) => {
switch (val.type) {
case "Javascript":
return {
...mockData,
};
case "Angular":
return {
...mockData,
title: ["Angular", "Selected Topic"],
leftColumn: [
{
key: "name",
label: "Angular Topic Name",
type: "string",
},
{
key: "id",
label: "Angular Topic Id",
type: "string",
},
],
};
case "React":
return {
...mockData,
title: ["React", "Selected Topic"],
leftColumn: [
{
key: "name",
label: "React Topic Name",
type: "string",
},
{
key: "id",
label: "Reacr Topic Id",
type: "string",
},
],
};
}
};
я пытаюсь использовать что-то ниже, но не получаю желаемого результата
const handleType = (val) => {
const newArray = [mockData];
console.log("newArray", newArray);
// const index = mockData.findIndex((ele) => ele);
// console.log("index", index);
// newArray["title"][0] = "React";
// console.log("newArray ==>", newArray);
switch (val.type) {
case "Javascript":
return {
...mockData,
};
case "Angular":
mockData.title[0] = "Angular";
return mockData.leftColumn.map((val, index) => {
let value = { ...val, label: "Angular",};
return Object.assign({}, value);
});
case "React":
return {
...mockData,
title: ["React", "Selected Topic"],
leftColumn: [
{
key: "name",
label: "React Topic Name",
type: "string",
},
{
key: "id",
label: "Reacr Topic Id",
type: "string",
},
],
};
}
};
const type = {
type: "Angular",
};
console.log("Angular", handleType(type));
Комментарии:
1. Почему вы сказали «необходимо обновить их соответствующее значение с помощью оператора распространения».? Кроме того, где ваш пример кода?
2. Если вы собираетесь перезаписывать все свойства объекта, которые вы распространяете позже в своем объектном литерале, тогда нет необходимости распространять mockData в первую очередь
3. Функция handleType() — это мое решение. Поскольку в массиве leftColumn объекта изменяется только значение ‘label’, а в массиве title обновляется только индекс 0. Я просто ищу какой-то более разумный подход
4. Я бы написал функцию
generateMockData(type)
, которая затем возвращает требуемую структуру объекта, устанавливаяtype
в разных местах (title: [type, "selected topic"]
). В любом случае, это слишком широко.