면접문제 - 편평화 수조
[1, [2, [3, [4]], 5]]
를 [1, 2, 3, 4, 5]
의 형식으로 바꾸는 것이다.처음에 나는 이 문제를 통해 귀속적인 사용을 고찰한 줄 알았는데 나중에 자세히 생각해 보니 일이 이렇게 간단한 것이 아니었다. 본고는 몇 가지 방식의 실현을 통해 이 문제가 고찰해야 할 내용을 이해하고자 한다.
귀속
귀환은 첫 번째 사고방식이다. 보통 사람들은 이 방법을 생각하지만 이 문제가 귀환을 고찰하는 것일 뿐이라면 이렇게 문제를 내지 않을 것이다.
function flatten (arr) {
var result = [];
(function(arr) {
var self = arguments.callee;
arr.forEach(function(item) {
// Array.isArray(item)
if(item instanceof Array) {
self(item);
} else {
result.push(item);
}
});
})(arr);
return result;
}
암시적 유형 변환
주요 고찰 수조
toString()
, valueOf()
방법의 사용, 이런 상황은 수조 요소 유형이 String과 Number이고 다른 상황은 모두 String 유형으로 전환된다.// toString
function flatten (arr) {
var str = arr.toString();
return str.split(',');
}
// valueOf
Array.prototype.valueOf = function() {
return this.join(',')
};
function flatten2 (arr) {
var str = arr.valueOf();
return str.split(',');
}
Generator
ES6에서 Generator 함수의 사용과 리턴 값이 범람기 대상으로서의 사용, 그리고 그룹을 고찰...(확장 연산자) 사용
function *_flatten (arr) {
for(let i = 0; i < arr.length; i++) {
const item = arr[i];
if(Array.isArray(item)) {
yield *_flatten(item);
} else {
yield item;
}
}
}
const flatten = arr => [..._flatten(arr)];
Symbol.iterator
ES6에서 Symbol을 고찰하다.iterator 사용
Array.prototype[Symbol.iterator] = function () {
let arr = [].concat(this);
let first = function (arr) {
return arr.shift();
};
return {
next: function() {
let item = first(arr);
if (item) {
return {
value: item.toString(),
done: false
}
} else {
return {
done: true
}
}
}
};
}
const flatten = arr => {
let res = [];
for(let i of arr) {
res.push(i);
}
return res.join(',').split(',');
};
또는generator 함수 + 귀속을 통해 실현
Array.prototype[Symbol.iterator] = function* (array) {
let arr = array || this;
let sel = arguments.callee;
for(let i = 0; i < arr.length; i++) {
const item = arr[i];
if(Array.isArray(item)) {
yield *sel(item);
} else {
yield item;
}
}
}
// test
var arr = [1, [2, [3, [4]], '5']];
console.log([...arr]);
...확장 연산자 + Array.prototype.some
function flatten(arr) {
var arr;
while (arr.some(v => Array.isArray(v))) {
arr = [].concat(...arr);
}
return arr;
}
Array.prototype.flat()
flat()
는 ES6에 새로 추가된 수조 방법으로 이 방법은 새로운 수조로 되돌아와 원 데이터에 영향을 주지 않는다.[1, [2, [3, [4]], 5]].flat(Infinity);
참고: 면접문제 - 편평화 수조
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring을 사용한 OpenAPI 생성이 기사에서는 사양으로 코드 생성을 사용하는 예를 고려합니다. 이것이 서비스 구축에 대한 접근 방식입니다. 은 java-spring 애플리케이션에서 코드를 생성하는 데 사용됩니다. 예제 프로젝트의 전체 소스 코드 간...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.