#javascript #function #ecmascript-6
#javascript #функция #ecmascript-6
Вопрос:
У меня есть вопрос по javascript: я выполнял несколько сложных упражнений из книги по JS, которую я изучаю, и я понятия не имею, как это сделать, и у меня нет примеров ответов. Цель состоит в том, чтобы написать функцию глубокого копирования, используя * только функции стрелки ES6 * без использования каких-либо методов JSON или каких-либо назначений переменных. Автор также не предлагает использовать области с использованием {}
скобок. Любые подсказки или советы о том, как я могу это сделать?
Комментарии:
1. Создайте рекурсивную функцию, которая принимает значение и возвращает его копию. Проверьте тип значения. Если это примитивно (строка, число, логическое значение …), просто верните его. Если это массив, верните новый массив, который сопоставляет каждый элемент рекурсивному вызову этой функции, и сделайте то же самое для каждого свойства, если это объект. Если у вас возникли проблемы с ES6, сначала сделайте это в ES5, пока не заработает, и попробуйте «перевести» его, но это не должно быть так сложно
2. Я реализовал это в ES5, но троичный вариант было довольно сложно понять, поскольку я не был уверен, что делать с возвращаемыми значениями. Также видел ваш пост ниже. Это работает так, как ожидалось, и я вижу, что вы сделали там с вложенными троичными (троичными?)
Ответ №1:
Создайте рекурсивную функцию, которая принимает значение и возвращает его копию. Проверьте тип значения. Если это массив, верните новый массив, который сопоставляет каждый элемент рекурсивному вызову этой функции. Если это объект, создайте новый объект с копиями его свойств. Если это примитивно (строка, число, логическое значение …), просто верните его.
Кстати, написание этого без какого-либо присваивания переменных и фигурных скобок может быть интересным для изучения, но это делает его намного менее читаемым. Я бы никогда не написал это так на работе:
const deepCopy = v =>
// Is it an Array?
v instanceof Array ?
// If it is, map every value to its copy
v.map(deepCopy) :
// Otherwise, is it a non-null Object?
(typeof v === "object" amp;amp; v !== null) ?
// If it is, create a new Object with copies of its property values
Object.entries(v)
.reduce((acc, [k, v]) => ({ ...acc, [k]: deepCopy(v) }), {}) :
// Otherwise, just return the value
v;
console.log(deepCopy({foo: 'bar', arr: [{baz: 42}, true]}));
console.log(deepCopy("Hello world"));
console.log(deepCopy(["a", "b", null]));
Ответ №2:
Вы можете получить массивы ключей и значений с помощью Object.keys() и Object.values(), затем выполнить итерацию и назначить эти элементы новому объекту, попробуйте это:
let obj = {key1: 'value1', key2: 'value2'};
let keys = Object.keys(obj);
let values = Object.values(obj)
console.log(keys, values)
let newObj = {};
for( let i = 0; i < keys.length; i ){
newObj[keys[i]] = values[i]
}
console.log(newObj);
newObj.key1 = 'asd';
console.log(newObj);
Комментарии:
1. О чем
let obj = { foo: { bar: 42 } }
? (внутренний объект не будет копией, это будет ссылка на оригинал)