Phản hồi của tôi chủ yếu dựa trên phản hồi được đánh giá cao nhất ở đây và hy vọng mọi người hiểu (cũng có lời giải thích tương tự trên GitHub của tôi). Đây là lý do tại sao sự áp đặt của anh ấy với bản đồ hoạt động:
Object.keys(images).map((key) => images[key] = 'url(' + '"' + images[key] + '"' +
')');
Mục đích của hàm là lấy một đối tượng và sửa đổi nội dung ban đầu của đối tượng bằng một phương thức có sẵn cho tất cả các đối tượng (các đối tượng và mảng giống nhau) mà không trả về một mảng. Hầu hết mọi thứ trong JS là một đối tượng và vì lý do đó, các yếu tố tiếp tục đi xuống đường kế thừa có thể có khả năng sử dụng kỹ thuật những thứ có sẵn cho những người trên dòng (và ngược lại nó xuất hiện).
Lý do điều này hoạt động là do các hàm .map trả về một mảng YÊU CẦU mà bạn cung cấp RETURN rõ ràng hoặc ẩn của một mảng thay vì chỉ sửa đổi một đối tượng hiện có. Về cơ bản, bạn lừa chương trình nghĩ rằng đối tượng là một mảng bằng cách sử dụng Object.keys sẽ cho phép bạn sử dụng chức năng bản đồ với tác động của nó đối với các giá trị mà các khóa riêng lẻ được liên kết với (tôi thực sự vô tình trả lại mảng nhưng đã sửa nó). Miễn là không có sự trở lại theo nghĩa thông thường, sẽ không có mảng nào được tạo với đối tượng ban đầu còn nguyên vẹn và được sửa đổi như được lập trình.
Chương trình cụ thể này lấy một đối tượng được gọi là hình ảnh và lấy các giá trị của các khóa của nó và nối các thẻ url để sử dụng trong một chức năng khác. Bản gốc là đây:
var images = {
snow: 'https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305',
sunny: 'http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-east-
Matanzas-city- Cuba-20170131-1080.jpg',
rain: 'https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg' };
... và sửa đổi là đây:
var images = {
snow: url('https://www.trbimg.com/img-5aa059f5/turbine/bs-md-weather-20180305'),
sunny: url('http://www.cubaweather.org/images/weather-photos/large/Sunny-morning-
east-Matanzas-city- Cuba-20170131-1080.jpg'),
rain: url('https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg')
};
Cấu trúc ban đầu của đối tượng được giữ nguyên cho phép truy cập thuộc tính bình thường miễn là không có trả lại. KHÔNG có nó trả về một mảng như bình thường và mọi thứ sẽ ổn. Mục tiêu là THAM GIA các giá trị ban đầu (hình ảnh [khóa]) cho những gì được mong muốn và không phải bất cứ điều gì khác. Theo như tôi biết, để ngăn chặn đầu ra mảng, phải có TÁI TẠO hình ảnh [khóa] và không có yêu cầu ngầm hoặc rõ ràng nào để trả về một mảng (việc gán biến thực hiện điều này và bị trục trặc qua lại cho tôi).
BIÊN TẬP:
Đi đến giải quyết phương pháp khác của anh ấy về việc tạo đối tượng mới để tránh sửa đổi đối tượng ban đầu (và việc gán lại dường như vẫn cần thiết để tránh vô tình tạo một mảng làm đầu ra). Các hàm này sử dụng cú pháp mũi tên và nếu bạn chỉ muốn tạo một đối tượng mới để sử dụng trong tương lai.
const mapper = (obj, mapFn) => Object.keys(obj).reduce((result, key) => {
result[key] = mapFn(obj)[key];
return result;
}, {});
var newImages = mapper(images, (value) => value);
Cách thức hoạt động của các chức năng này là như vậy:
mapFn lấy hàm để thêm vào sau (trong trường hợp này (value) => value) và chỉ cần trả về bất cứ thứ gì được lưu trữ ở đó làm giá trị cho khóa đó (hoặc nhân với hai nếu bạn thay đổi giá trị trả về như anh ta đã làm) trong mapFn ( obj) [khóa],
và sau đó xác định lại giá trị ban đầu được liên kết với khóa trong kết quả [key] = mapFn (obj) [key]
và trả về hoạt động được thực hiện trên kết quả (bộ tích lũy nằm trong dấu ngoặc được bắt đầu ở cuối hàm .reduce).
Tất cả điều này đang được thực hiện trên đối tượng đã chọn và VẪN CÓ THỂ yêu cầu ngầm định cho một mảng được trả về và chỉ hoạt động khi gán lại các giá trị theo như tôi có thể nói. Điều này đòi hỏi một số môn thể dục tinh thần nhưng làm giảm các dòng mã cần thiết như có thể thấy ở trên. Đầu ra giống hệt như có thể được nhìn thấy dưới đây:
{snow: "https://www.trbimg.com/img-5aa059f5/turbine/bs-
md-weather-20180305", sunny: "http://www.cubaweather.org/images/weather-
photos/l…morning-east-Matanzas-city-Cuba-20170131-1080.jpg", rain:
"https://i.pinimg.com/originals/23/d8
/ab/23d8ab1eebc72a123cebc80ce32b43d8.jpg"}
Hãy ghi nhớ điều này đã làm việc với NON-NUMBERS. Bạn có thể sao chép BẤT K object đối tượng nào bằng cách SIMPLY TRẢ LẠI GIÁ TRỊ trong hàm mapFN.
Object.keys
, không có bất kỳ thứ tự được xác định rõ. Đó có thể là vấn đề, tôi đề nghị sử dụngObject.getOwnPropertyNames
thay thế.