찾다
웹 프론트엔드JS 튜토리얼JavaScript 주제 8: 배열 평면화

JavaScript 주제 8: 배열 평면화

Mar 11, 2021 am 09:42 AM
javascript

JavaScript 주제 8: 배열 평면화

1. 재귀

3.apply+some
  • 4. toString
  • 6. 당신만의 flat tool 방식
  • 은 마지막에 작성
  • (무료 학습 추천:
  • javascript 비디오 튜토리얼

)JavaScript 주제 8: 배열 평면화

1. Recursion for 루프는 배열 연산을 수행할 때 가장 쉽게 생각하는 것은 시간과 공간의 복잡성을 고려하지 않을 때 재귀가 완벽한 선택이어야 한다는 것입니다! 예:

输入 
const arr = [1, [2, [3, 4, { a: 1 }], null], undefined];`
输出 
[ 1, 2, 3, 4, { a: 1 }, null, undefined ]

코드:

function flatten(arr) {
    let res = [];
    for (let i = 0; i <p></p>참고: <p><strong></strong></p>배열에 있는 요소의 기본 유형을 결정하세요<p><strong>배열이 아닌 경우: 새 배열에 직접 저장하세요</strong> </p>배열인 경우: 배열이 아닌 마지막 요소가 새 배열에 저장될 때까지 첫 번째 단계를 단계별로 반복합니다.<p><strong></strong></p> 2. 감소<ol>
<li>먼저 가 감소하는 것이 무엇인지 살펴보겠습니다. 의 기능: <code>reduce() </code> 메서드는 배열의 각 요소에 대해 제공한 <code>감소기 함수</code>를 (오름차순으로) 실행하여 그 결과를 단일 반환으로 요약합니다. 값. <li>
<li>예: </li>
</ol><pre class="brush:php;toolbar:false">输入 
const arr = [1, [2, [3, 4, { a: 1 }], null], undefined];`
输出 
[ 1, 2, 3, 4, { a: 1 }, null, undefined ]

코드:

function flatten(arr) {
    return arr.reduce((prev, next) => {
        // prev表示上一次操作的结果
        return prev.concat(Array.isArray(next) ? flatten(next) : next)
    }, [])
    // 注意reduce的初始值应该是[],否则无法进行拼接}

reduce是做什么的:reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

示例:

function flatten(arr) {
    while (arr.some(item => Array.isArray(item))) {
        // 只要存在数组类型的元素,就抹平一层
        arr = [].concat.apply([], arr)
    }
    return arr;}

代码:

let res = [];res  = res.concat({});// 等价于[].concat.apply([], [{}])

注意:

仔细对照方法一方法二,两者思路完全一致——找到数据类型是数组的子元素,对其进行抹平处理,只不过实现的细节略有不同。

唯一需要注意的地方就是拼接时数据的基本类型要以数组开始。

三、apply+some

既然方法二是方法一的变式,那个方法三也可以说是方法二的变式,但不在采用递归的方式,而是一层一层“拆除”嵌套的方式

先来看看用到的API:

  • apply:调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。
  • some:测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值

代码:

arr = [].concat.apply([], arr);// 等价于[].concat(1, [2, [3, 4, { a: 1 }], null], undefined)

注意:

大家疑惑的点主要在apply,其实主要目的就是减少括号

function flatten(arr) {
    while (arr.some(item => Array.isArray(item))) {
        // 只要存在数组类型的元素,就抹平一层
        arr = [].concat(...arr)
    }
    return arr;}

在本例中:

function flatten(arr) {
    return arr.toString().split(',').map(function(item){
        return +item    })}

四、ES6展开运算符

大家可能业也注意到了,方法一到方法三 我们不断的借助现有方法,以精简我们的代码量,本方法也是如此~

我们利用ES6的展开运算符(用于取出参数对象的所有可遍历属性,拷贝到当前对象之中),继续精简方法三:

代码:

function flatten(arr) {
    return JSON.stringify(arr).replace(/\[|\]/g, '').split(',');}

五、toString

如果前面四个方法是我们可以实现的主流的方式,那么接下来的几个就是我们可以实现的“非主流”方式,直接上代码!

function flatten(arr) {
    return JSON.parse('[' + JSON.stringify(arr).replace(/\[|\]/g, '').split(',') + ']')}

注意:

将数据转换类型存在类型的限制,如果原始数据是这样的:[1, ‘2’],那么就会出现问题

六、正则

假如我们默认了类型会被转换这一缺陷,那么还可以通过更暴力里的方式来将数组扁平化:

 /*
 * @private
 * @param {Array} array 需要扁平化的数组
 * @param {number} depth 最多处理几层
 * @param {boolean} [isStrict] 是否严格处理函数
 * @param {Array} [result=[]] 输出的数组
 * @returns {Array}
 */function flatten(array, depth, isStrict, result) {
    result || (result = [])
    // 边界
    if (array == null) return result;

    for (const value of array) {
        if (depth > 0 && Array.isArray(value)) {
            if (depth > 1) {
                flatten(value, depth - 1, isStrict, result)
            } else {
                result.push(...value); // 只拆1层
            }
        } else if (!isStrict) {
            result[result.length] = value        }
    }
    return result;}

注意:

如果是纯数组,貌似没什么问题

const res = flatten([1, 2, [3, 4, [5, 6]], { a: 1 }, null, undefined], 1, false);// [ 1, 2, 3, 4, [ 5, 6 ], { a: 1 }, null, undefined ]

但如果数组内存在对象,就需要消除JSON后的后果,这样更严谨一些~

到这里,六种方法算是包括了大部分数组扁平化的实现,那么如果希望将我们的方法“升级”成工具怎么办?这时候我们就要“抄袭”一下loadsh了~

JavaScript 주제 8: 배열 평면화

七、实现自己的扁平化工具方法

这里我们简化了loadsh里的flatten函数,具体改动我们来看代码:

const res = flatten([1, 2, [3, 4, [5, 6]], { a: 1 }, null, undefined], 1, true);// [ 3, 4, [ 5, 6 ] ]const res = flatten([1, 2, [3, 4, [5, 6]], { a: 1 }, null, undefined], 2, true);// [ 5, 6 ]
  1. 该方法提供了扁平化层数
rrreee
  1. 该方法提供了扁平化后相反的效果
rrreee

isStrict참고:

방법 1

방법 2을 주의 깊게 비교하세요. 두 가지 아이디어는 완전히 동일합니다. 배열 데이터 유형은 Smooth it out이지만 약간 다른 세부 사항으로 구현합니다. 주의해야 할 점은 스플라이싱 시 기본 데이터 유형이 배열로 시작해야 한다는 것입니다. Three, apply+some

방법 2는 방법 1의 변형이므로 방법 3도 방법 2의 변형이라고 할 수 있지만 더 이상 재귀적이지 않고 계층별로 "해체"됩니다. 중첩 방법 🎜🎜먼저 사용된 API를 살펴보겠습니다. 🎜🎜🎜apply: 주어진 이 값으로 함수를 호출하고 배열(또는 배열과 유사한 객체) 형식으로 제공합니다. 매개변수. 🎜🎜some: 배열에 있는 하나 이상의 요소가 제공된 기능 테스트를 통과하는지 테스트합니다. 부울 유형 값을 반환합니다 🎜🎜🎜🎜코드: 🎜🎜rrreee🎜🎜참고: 🎜🎜🎜혼란의 주요 지점은 적용입니다. 실제로 주요 목적은 괄호를 줄이는 것입니다 🎜rrreee. 🎜 이 예에서는: 🎜rrreee🎜🎜4. ES6 스프레드 연산자🎜🎜🎜방법 1에서 방법 3까지 우리는 코드 양을 간소화하기 위해 지속적으로 기존 방법에 의존한다는 것을 알 수 있습니다. ~🎜 🎜ES6의 확산 연산자(매개변수 객체의 모든 탐색 가능한 속성을 꺼내서 현재 객체에 복사하는 데 사용됨)를 사용하여 계속해서 간소화된 방법 3: 🎜🎜🎜코드: 🎜🎜rrreee🎜🎜5. 🎜🎜처음 네 가지 방법이 우리가 구현할 수 있는 주류 방법이라면 다음 몇 가지 방법은 우리가 구현할 수 있는 "비주류" 방법입니다. 코드로 이동하세요! 🎜rrreee🎜🎜참고: 🎜🎜🎜데이터를 변환할 때 유형 제한이 있습니다. 원본 데이터가 [1, '2']와 같으면 문제가 발생합니다🎜🎜🎜6 규칙성🎜🎜🎜. 유형이 변환된다는 결함 외에도 더 폭력적인 방법으로 배열을 평면화할 수도 있습니다. 🎜rrreee🎜🎜참고: 🎜🎜🎜순수 배열이면 문제 없는 것 같습니다🎜rrreee🎜하지만 배열에 객체가 있으면 JSON의 결과를 제거해야 더 엄격해집니다~🎜🎜이 시점에서 6가지 방법에는 배열 평면화 구현의 대부분이 포함되어 있으므로 " 우리의 방법을 도구로 업그레이드? 이때 우리는 loadsh를 "표절"해야 합니다~🎜🎜JavaScript 주제 8: 배열 평면화🎜🎜🎜7. 자신만의 평면화 도구 방법을 구현하세요🎜🎜🎜여기서 loadsh의 평면화 기능을 단순화했습니다. 특정 변경 사항에 대한 코드를 살펴보겠습니다.🎜rrreee🎜🎜이 방법은 평면화 레이어 수를 제공합니다🎜🎜rrreee
    🎜이 방법은 병합 후 반대 효과를 제공합니다🎜🎜rrreee🎜isStrict 매개변수가 설정된 후 노출된 요소는 병합 후 유지되고 얕은 레이어는 제거됩니다. 요소. 🎜🎜여기에 글을 쓰면서 우리는 플랫 처리 아이디어를 이해했으며 특정 구현 기능을 갖추고 있습니다. 위 코드를 완전히 이해할 수 있다면 플랫 부분이 어렵지 않을 것이라고 믿습니다. loadsh 방법~🎜🎜🎜🎜관련 무료 학습 권장 사항: 🎜🎜🎜javascript🎜🎜🎜(동영상) 🎜🎜🎜

위 내용은 JavaScript 주제 8: 배열 평면화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 CSDN에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
JavaScript가 C로 작성 되었습니까? 증거를 검토합니다JavaScript가 C로 작성 되었습니까? 증거를 검토합니다Apr 25, 2025 am 12:15 AM

예, JavaScript의 엔진 코어는 C로 작성되었습니다. 1) C 언어는 효율적인 성능과 기본 제어를 제공하며, 이는 JavaScript 엔진 개발에 적합합니다. 2) V8 엔진을 예를 들어, 핵심은 C로 작성되며 C의 효율성 및 객체 지향적 특성을 결합하여 C로 작성됩니다.

JavaScript의 역할 : 웹 대화식 및 역동적 인 웹JavaScript의 역할 : 웹 대화식 및 역동적 인 웹Apr 24, 2025 am 12:12 AM

JavaScript는 웹 페이지의 상호 작용과 역학을 향상시키기 때문에 현대 웹 사이트의 핵심입니다. 1) 페이지를 새로 고치지 않고 콘텐츠를 변경할 수 있습니다. 2) Domapi를 통해 웹 페이지 조작, 3) 애니메이션 및 드래그 앤 드롭과 같은 복잡한 대화식 효과를 지원합니다. 4) 성능 및 모범 사례를 최적화하여 사용자 경험을 향상시킵니다.

C 및 JavaScript : 연결이 설명되었습니다C 및 JavaScript : 연결이 설명되었습니다Apr 23, 2025 am 12:07 AM

C 및 JavaScript는 WebAssembly를 통한 상호 운용성을 달성합니다. 1) C 코드는 WebAssembly 모듈로 컴파일되어 컴퓨팅 전력을 향상시키기 위해 JavaScript 환경에 도입됩니다. 2) 게임 개발에서 C는 물리 엔진 및 그래픽 렌더링을 처리하며 JavaScript는 게임 로직 및 사용자 인터페이스를 담당합니다.

웹 사이트에서 앱으로 : 다양한 JavaScript 애플리케이션웹 사이트에서 앱으로 : 다양한 JavaScript 애플리케이션Apr 22, 2025 am 12:02 AM

JavaScript는 웹 사이트, 모바일 응용 프로그램, 데스크탑 응용 프로그램 및 서버 측 프로그래밍에서 널리 사용됩니다. 1) 웹 사이트 개발에서 JavaScript는 HTML 및 CSS와 함께 DOM을 운영하여 동적 효과를 달성하고 jQuery 및 React와 같은 프레임 워크를 지원합니다. 2) 반응 및 이온 성을 통해 JavaScript는 크로스 플랫폼 모바일 애플리케이션을 개발하는 데 사용됩니다. 3) 전자 프레임 워크를 사용하면 JavaScript가 데스크탑 애플리케이션을 구축 할 수 있습니다. 4) node.js는 JavaScript가 서버 측에서 실행되도록하고 동시 요청이 높은 높은 요청을 지원합니다.

Python vs. JavaScript : 사용 사례 및 응용 프로그램 비교Python vs. JavaScript : 사용 사례 및 응용 프로그램 비교Apr 21, 2025 am 12:01 AM

Python은 데이터 과학 및 자동화에 더 적합한 반면 JavaScript는 프론트 엔드 및 풀 스택 개발에 더 적합합니다. 1. Python은 데이터 처리 및 모델링을 위해 Numpy 및 Pandas와 같은 라이브러리를 사용하여 데이터 과학 및 기계 학습에서 잘 수행됩니다. 2. 파이썬은 간결하고 자동화 및 스크립팅이 효율적입니다. 3. JavaScript는 프론트 엔드 개발에 없어서는 안될 것이며 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축하는 데 사용됩니다. 4. JavaScript는 Node.js를 통해 백엔드 개발에 역할을하며 전체 스택 개발을 지원합니다.

JavaScript 통역사 및 컴파일러에서 C/C의 역할JavaScript 통역사 및 컴파일러에서 C/C의 역할Apr 20, 2025 am 12:01 AM

C와 C는 주로 통역사와 JIT 컴파일러를 구현하는 데 사용되는 JavaScript 엔진에서 중요한 역할을합니다. 1) C는 JavaScript 소스 코드를 구문 분석하고 추상 구문 트리를 생성하는 데 사용됩니다. 2) C는 바이트 코드 생성 및 실행을 담당합니다. 3) C는 JIT 컴파일러를 구현하고 런타임에 핫스팟 코드를 최적화하고 컴파일하며 JavaScript의 실행 효율을 크게 향상시킵니다.

자바 스크립트 행동 : 실제 예제 및 프로젝트자바 스크립트 행동 : 실제 예제 및 프로젝트Apr 19, 2025 am 12:13 AM

실제 세계에서 JavaScript의 응용 프로그램에는 프론트 엔드 및 백엔드 개발이 포함됩니다. 1) DOM 운영 및 이벤트 처리와 관련된 TODO 목록 응용 프로그램을 구축하여 프론트 엔드 애플리케이션을 표시합니다. 2) Node.js를 통해 RESTFULAPI를 구축하고 Express를 통해 백엔드 응용 프로그램을 시연하십시오.

JavaScript 및 웹 : 핵심 기능 및 사용 사례JavaScript 및 웹 : 핵심 기능 및 사용 사례Apr 18, 2025 am 12:19 AM

웹 개발에서 JavaScript의 주요 용도에는 클라이언트 상호 작용, 양식 검증 및 비동기 통신이 포함됩니다. 1) DOM 운영을 통한 동적 컨텐츠 업데이트 및 사용자 상호 작용; 2) 사용자가 사용자 경험을 향상시키기 위해 데이터를 제출하기 전에 클라이언트 확인이 수행됩니다. 3) 서버와의 진실한 통신은 Ajax 기술을 통해 달성됩니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)