JS常用函數整理--set&split&join

在實際編寫代碼處理問題時,發現對數組對象的處理還是很陌生,在這裏記錄一下使用方法。


編寫背景及參考代碼

交易金額超過 ¥1000
或者,它和另一個城市中同名的另一筆交易相隔不超過 60 分鐘(包含 60 分鐘整)
每個交易字符串 transactions[i] 由一些用逗號分隔的值組成,這些值分別表示交易的名稱,時間(以分鐘計),金額以及城市。

給你一份交易清單 transactions,返回可能無效的交易列表。你可以按任何順序返回答案。
示例 1:

輸入:transactions = [“alice,20,800,mtv”,“alice,50,100,beijing”]
輸出:[“alice,20,800,mtv”,“alice,50,100,beijing”]
解釋:第一筆交易是無效的,因爲第二筆交易和它間隔不超過 60 分鐘、名稱相同且發生在不同的城市。同樣,第二筆交易也是無效的。

示例 2:

輸入:transactions = [“alice,20,800,mtv”,“alice,50,1200,mtv”]
輸出:[“alice,50,1200,mtv”]
示例 3:

輸入:transactions = [“alice,20,800,mtv”,“bob,50,1200,mtv”]
輸出:[“bob,50,1200,mtv”]

提示:

transactions.length <= 1000
每筆交易 transactions[i] 按 “{name},{time},{amount},{city}” 的格式進行記錄
每個交易名稱 {name} 和城市 {city} 都由小寫英文字母組成,長度在 1 到 10 之間
每個交易時間 {time} 由一些數字組成,表示一個 0 到 1000 之間的整數
每筆交易金額 {amount} 由一些數字組成,表示一個 0 到 2000 之間的整數

解答:
var invalidTransactions = function (transactions) {
            let invalid = new Set();
            transactions.forEach((element, index) => { //將transactions轉成便於比較的二維數組
                transactions[index] = element.split(",");
            });
            for (let i = 0; i < transactions.length; i++) { //兩層遍歷取符和結果的值
                if (transactions[i][2] > 1000) {
                    invalid.add(transactions[i].join(","));
                }
                    for (let j = i + 1; j < transactions.length; j++) {
                        if (transactions[j][0] === transactions[i][0]
                            && Math.abs(transactions[i][1] - transactions[j][1]) <= 60
                            && transactions[i][3] != transactions[j][3]) {
                            invalid.add(transactions[i].join(","));
                            invalid.add(transactions[j].join(","));
                        }
                }
            }
            return [...invalid];
        };

思考及學習

在我自己實際答題時,未注意將每個元素進行二維數組分割這樣一個操作,默認成了數組對象的組成方式:

transactions:[
               {
                      id:1,
                      name:"alice",
                      amount:800,
                      time:20,
                      city:"mtv"
               },
               {
                     id:2,
                     name:"alice",
                     amount:100,
                     time:50,
                      city:"beijing"
              }
           ]

因此在實際運行過程中一直無結果輸出。

set的使用

ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重複的值。這也省去了本題中,需要去除重複的需求。
代碼示例:

	const s = new Set();
	[2,3,5,4,5,2,2].forEach(x => s.add(x));
	// Set結構不會添加重複的值
	for(let i of s) {
		 console.log(i);
	}

打印結果:
打印結果
將本題的字符輸入進行測試
測試
set中每一個值都不會重複,但是,爲何在本題“前端小隊長”寫的那串代碼輸出的時候,可以做到顯示的是["alice,20,800,mtv", "alice,50,100,beijing"],這裏就要提及數組處理方法split和join了

join使數組變字符串

        let ListBefore=["1","2","3","4"];
        joinList = ListBefore.join(",");
        console.log(joinList);

輸出結果:
在這裏插入圖片描述

split使字符串變數組

strToList=joinList.split(",")
//輸出結果 (4) ["1", "2", "3", "4"]

可以通過兩個變量的值看出這一轉換過程
數組字符串
分析時發現,將字符串數組進行拆分,變成二維數組的方法竟然是這樣,emmm,js的語法還是要好好地看一看

            transactions.forEach((element, index) => { //將transactions轉成便於比較的二維數組
                transactions[index] = element.split(",");
            });
附解決方案參考來源:
CSDN博主「前端小端長」
原文鏈接:https://blog.csdn.net/zhang1339435196/article/details/101440416
題目來源:
力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/invalid-transactions

這裏是我在看到“前端小隊長”的寫法前隨意寫的解法。
因爲不知道data的渲染需要在函數最後加 THIS 琢磨了好久都沒有結果。還好及時請教了小夥伴

 this.test=result

這裏是我拙劣的解答

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>測試</title>
    <style>
        [v-cloak]{
            display:none;
        }
        *{
            padding:0;
            margin:0;
            list-style:none;
        }

        .container{
            width:90%;
            margin:10px auto;
            line-height: 20px;
        }

        .thead-ul
        {
            display: flex;
            border:1px solid burlywood;
            padding: 10px;
            color:burlywood;
        }

        .thead-ul li
        {
            flex:1;
            text-align:center;
            align-items: center;
            padding:20px ;
        }
    </style>
</head>
<body>
    <div id="app" v-cloak>
        <div class="container">
            <span>輸入</span>
            <!-- <input type="text" :value="test"> -->
            <ul class="thead-ul">
                <li>name</li>
                <li>time</li>
                <li>amount</li>
                <li>city</li>
            </ul>
            <ul class="thead-ul" v-for="item in transactions">
                <li>{{item.name}}</li>
                <li>{{item.time}}</li>
                <li>{{item.amount}}</li>
                <li>{{item.city}}</li>
            </ul>
            <span>輸出</span>
            <button @click="invalidTransactions(transactions,test)">函數調用</button>
            <div style="height:100px;border:1px solid burlywood">
                <ul class="thead-ul" v-for="item in test">
                    <li>{{item.name}}</li>
                    <li>{{item.time}}</li>
                    <li>{{item.amount}}</li>
                    <li>{{item.city}}</li>
                </ul>
            </div>
        </div>
    </div>
        <script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
    <script>
        Vue.config.devtools = false
        Vue.config.productionTip = false    
        new Vue({
            el:"#app",
            methods: {
                invalidTransactions(transactions,test){
                    let result=[];
                    var keys;
                    var j;
                    var i;
                    for (var j=0;j< transactions.length;j++)
                    {
                        keys= transactions[j];
                        if (keys.amount>1000)
                        {
                            if(result.length==0){
                                result.push(keys)
                            }else{
                               let flag=0
                               for (let m=0;m<result.length;m++)
                               {
                                   if(keys.id==result.id){flag=1;break}
                               }
                               if(flag==0){result.push(keys)}   
                            }
                        }
                        for(i=j+1;i<transactions.length;i++ )
                        {
                            if(keys.name==transactions[i].name && keys.city!=transactions[i].city && Math.abs(keys.time-transactions[i].time)<=60)
                                { 
                                    if(result.length==0){
                                        result.push(keys)
                                        result.push(transactions[i])
                                    }else{
                                        let flag1=0
                                        let flag2=0
                                        for (let m=0;m<result.length;m++)
                                        {
                                            if(keys.id==result.id){flag1=1;break}
                                            if(transactions[i].id==result.id){flag2=1;break}
                                        }
                                        if(flag1==0){result.push(keys)}
                                        if(flag2==0){result.push(keys)}
                                    }
                                }
                        }
                    }
                    this.test=result
                }
            },
            data() {
                return {
                    transactions:[
                        {
                            id:1,
                            name:"alice",
                            amount:800,
                            time:20,
                            city:"mtv"
                        },
                        {
                            id:2,
                            name:"alice",
                            amount:100,
                            time:50,
                            city:"beijing"
                        }
                    ],
                    test:[]
                }
            }
        })
    </script>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章