シナリオの問題 (主に配列オブジェクトの es6 メソッドを使用) は参考のみです。実際、このシナリオでは sort の方が適しています。

シナリオの問題

このような配列があるとします。配列は順序どおりに配置されておらず、配列内の各項目にはデータの型を示す型フィールドがあります。

  • // type表示类型
    // 例如 1代表日任务,2代表周任务,3代表月任务
    const orignList = [
        {
          
           name: "1类型下的任务项...", type: 1 },
        {
          
           name: "3类型下的任务项...", type: 3 },
        {
          
           name: "3类型下的任务项...", type: 3 },
        {
          
           name: "2类型下的任务项...", type: 2 },
        {
          
           name: "1类型下的任务项...", type: 1 },
        {
          
           name: "2类型下的任务项...", type: 2 },
        {
          
           name: "1类型下的任务项...", type: 1 },
        {
          
           name: "1类型下的任务项...", type: 1 },
        {
          
           name: "1类型下的任务项...", type: 1 },
        {
          
           name: "2类型下的任务项...", type: 2 },
        {
          
           name: "2类型下的任务项...", type: 2 },
        {
          
           name: "3类型下的任务项...", type: 3 },
        {
          
           name: "3类型下的任务项...", type: 3 },
        {
          
           name: "2类型下的任务项...", type: 2 },
        {
          
           name: "3类型下的任务项...", type: 3 },
    ]
    

次に、これらのタスクを分類して統合し、同じ種類のデータを統合して、大きいものから小さいものまでタイプ別に分類する、つまり、次のような結果に処理する必要があります。

  • 当時は混乱しました。実際には、sort を使用して並べ替えるだけです。以下は強制メソッドの束です。これらはいくつかのメソッドの応用例にすぎません。知っていただければ幸いです。

  • // type表示类型
    // 例如 1代表日任务,2代表周任务,3代表月任务
    const finalList = [
        {
          
           "name": "3类型下的任务项...", "type": 3 },
        {
          
           "name": "3类型下的任务项...", "type": 3 },
        {
          
           "name": "3类型下的任务项...", "type": 3 },
        {
          
           "name": "3类型下的任务项...", "type": 3 },
        {
          
           "name": "3类型下的任务项...", "type": 3 },
        {
          
           "name": "3类型下的任务项...", "type": 2 },
        {
          
           "name": "3类型下的任务项...", "type": 2 },
        {
          
           "name": "3类型下的任务项...", "type": 2 },
        {
          
           "name": "3类型下的任务项...", "type": 2 },
        {
          
           "name": "3类型下的任务项...", "type": 2 },
        {
          
           "name": "3类型下的任务项...", "type": 1 },
        {
          
           "name": "3类型下的任务项...", "type": 1 },
        {
          
           "name": "3类型下的任务项...", "type": 1 },
        {
          
           "name": "3类型下的任务项...", "type": 1 },
        {
          
           "name": "3类型下的任务项...", "type": 1 },
    ]
    

解決

  • まずデータをタイプ別に分類します

  • let orignObj = {
          
          } // 创建一个空对象
    orignList.forEach(item => {
          
          
        if (Object.keys(orignObj).includes(item.type + '')) {
          
          
            // 如果orignObj存在属性名为当前遍历项type的属性,就直接追加数据
            // 注意:因为type是数字,但Object.keys得到的数组每一项都是字符串,需要将遍历项的type转换成字符串,否则匹配失败
            orignObj[item.type].push(item)
        } else {
          
          
            // 否则就是第一次添加该属性,做初始操作
            orignObj[item.type] = [item]
        }
    })
    
  • 最終的には以下のような構成に整理されました

  • {
          
          
        "1": [
            {
          
           "name": "3类型下的任务项...", "type": 1 },
            {
          
           "name": "3类型下的任务项...", "type": 1 },
            {
          
           "name": "3类型下的任务项...", "type": 1 },
            {
          
           "name": "3类型下的任务项...", "type": 1 },
            {
          
           "name": "3类型下的任务项...", "type": 1 },
        ],
        "2": [
            {
          
           "name": "3类型下的任务项...", "type": 2 },
            {
          
           "name": "3类型下的任务项...", "type": 2 },
            {
          
           "name": "3类型下的任务项...", "type": 2 },
            {
          
           "name": "3类型下的任务项...", "type": 2 },
            {
          
           "name": "3类型下的任务项...", "type": 2 },
        ],
        "3": [
            {
          
           "name": "3类型下的任务项...", "type": 3 },
            {
          
           "name": "3类型下的任务项...", "type": 3 },
            {
          
           "name": "3类型下的任务项...", "type": 3 },
            {
          
           "name": "3类型下的任务项...", "type": 3 },
            {
          
           "name": "3类型下的任务项...", "type": 3 },
        ]
    }
    
  • 次に、属性名の降順でデータを並べ替えます。

  • 使用される Object.entries メソッド

  • let temptArr = Object.entries(taskObj) // 转化成数组,数组每一项第一项都是属性名, 第二项是对应的属性值
    temptArr.sort((a, b) => b[0] - a[0]) // 按照第一项也就输属性名进行排序
    
  • 次のデータを取得します

  • [
        [
            "3",
            [
                {
          
          
                    "name": "3类型下的任务项...",
                    "type": 3
                },
                {
          
          
                    "name": "3类型下的任务项...",
                    "type": 3
                },
                {
          
          
                    "name": "3类型下的任务项...",
                    "type": 3
                },
                {
          
          
                    "name": "3类型下的任务项...",
                    "type": 3
                },
                {
          
          
                    "name": "3类型下的任务项...",
                    "type": 3
                }
            ]
        ],
        [
            "2",
            [
                {
          
          
                    "name": "2类型下的任务项...",
                    "type": 2
                },
                {
          
          
                    "name": "2类型下的任务项...",
                    "type": 2
                },
                {
          
          
                    "name": "2类型下的任务项...",
                    "type": 2
                },
                {
          
          
                    "name": "2类型下的任务项...",
                    "type": 2
                },
                {
          
          
                    "name": "2类型下的任务项...",
                    "type": 2
                }
            ]
        ],
        [
            "1",
            [
                {
          
          
                    "name": "1类型下的任务项...",
                    "type": 1
                },
                {
          
          
                    "name": "1类型下的任务项...",
                    "type": 1
                },
                {
          
          
                    "name": "1类型下的任务项...",
                    "type": 1
                },
                {
          
          
                    "name": "1类型下的任务项...",
                    "type": 1
                },
                {
          
          
                    "name": "1类型下的任务项...",
                    "type": 1
                }
            ]
        ]
    ]
    
  • 次に、処理された配列を走査して、最終的な処理結果を取得します。

  • let finalArr = temptArr.reduce((prev, curr) => [...prev, ...curr[1]], [])
    
  • Object.fromEntries() 当初はソート済みのデータをオブジェクトに戻すメソッドを使おうと思ったのですが、リストアされたデータが属性名に従ってソートされておらず、前のデータに戻ってしまってうまくいかなかったので、処理済みのデータをトラバースすることを考えましたObject.entries()問題を解決する配列。

使用される方法

オブジェクト.キー(obj)

  • パラメータ: 処理対象のオブジェクト

  • 戻り値:処理対象の属性名の配列を返します。

  • 例えば

  • // 对象方法
    const a = {
          
          
        name: '小kun',
        age: 2.5,
        hobby: ['唱', '跳', 'rap', '篮球']
    }
    
    const b = [1, 2, 3]
    
    const c = '爱你孤身走暗巷'
    
    console.log('a.keys', Object.keys(a)) // a.keys (3) ['name', 'age', 'hobby']
    console.log('a.values', Object.values(a)) // ["小kun",2.5,["唱","跳","rap","篮球"]]
    
    console.log('b.keys', Object.keys(b)) // 返回索引 b.keys (3) ['0', '1', '2']
    console.log('b.values', Object.values(b)) // 返回每一项的值 b.values (3) [1, 2, 3]
    
    console.log('c.keys', Object.keys(c)) // 返回索引 c.keys (7) ['0', '1', '2', '3', '4', '5', '6']
    console.log('c.values', Object.values(c)) // 返回每一项的值 c.values (7) ['爱', '你', '孤', '身', '走', '暗', '巷']
    
    // Object.values(obj) 和Object.keys(obj)类似,参数是处理对象,返回该对象属性值所组成的数组
    

オブジェクト.エントリ(obj)

  • パラメータ: 処理対象のオブジェクト

  • 戻り値: 処理されるオブジェクトの列挙可能なプロパティのキーと値のペアの配列

    • 平たく言えば、戻り値は配列、配列の各項目は配列、各項目の最初の項目はオブジェクトのキー、2 番目の項目はオブジェクトの値です。
  • 例えば

  • const a = {
          
          
        name: '小kun',
        age: 2.5,
        hobby: ['唱', '跳', 'rap', '篮球']
    }
    const b = [1, 2, 3]
    const c = '爱你孤身走暗巷'
    
    console.log('a.entries', Object.entries(a)) 
    /*
    	[
    	    [ "name", "小kun" ],
        	[ "age", 2.5 ],
        	[ "hobby", [ "唱", "跳", "rap", "篮球" ] ]
    	]
    */
    console.log('b.entries', Object.entries(b))
    
    /*
    	[
    	    [ "0", 1 ],
        	[ "1", 2 ],
        	[ "2", 3 ]
    	]
    */
    console.log('c.entries', Object.entries(c));
    /*
    	[
        	[ "0", "爱" ],
        	[ "1", "你" ],
        	[ "2", "孤" ],
        	[ "3", "身" ],
        	[ "4", "走" ],
        	[ "5", "暗" ],
        	[ "6", "巷" ]
    	]
    */
    

Object.fromEntries(obj)

  • Object.entries(obj) に相当します

  • パラメータ: 処理対象の配列 (配列内の各項目は配列、各項目の最初の項目は属性名、2 番目の項目は属性値)

  • 戻り値: オブジェクトを返します。

Array.reduce(fn)

// prev 上一次调用回调时的返回值,或者初始值 init;
// cur 当前处理的数组元素 ,类似于forEach, map之类的item
// index 当前遍历项的索引
// arr 代表arr数组
arr.reduce((prev,cur,index,arr) => {
    
    
    ...
}, init);
1.合計
let arr = [1, 2, 3, 4]

// 未指定初始值
let sum = arr.reduce((prev, cur) => {
    
    
    return prev + cur
}) // 10

// 指定了初始值
let sum = arr.reduce((prev, cur) => {
    
    
    return prev + cur
}, 10) // 20
2. 最大値を求める
let max = arr.reduce(function (prev, cur) {
    
    
    return Math.max(prev,cur);
}); // 4
3. 重複を削除する
  • アイデア
    • 最初は空の配列
    • 各項目を反復処理する
    • この項目が prev に存在する場合は、prev を変更しないでください。
    • それ以外の場合は、現在のトラバーサル項目を prev に追加します。
    • トラバーサルが完了すると、prev が最後の重複排除されたアレイになります。
    • つまり、reduce の戻り値は
const arr1 = [1, 2, 3, 4, 2, 1, 5]
const newArr = arr.reduce((prev, cur) => prev.indexOf(cur) ? [...prev, cur] : prev, []) 
console.log(newArr); // [1, 2, 3, 4, 5]
4. 配列の結合
  • 上記で使用した方法は配列結合方法です。

  • 初期の空の配列

  • 1 つの項目がトラバースされるたびに、データが prev 配列にマージされ、マージされた配列が最終的に取得されます。

  • let finalArr = temptArr.reduce((prev, curr) => [...prev, ...curr[1]], [])
    

おすすめ

転載: blog.csdn.net/B1841630/article/details/132831882