鍍金池/ 問答/HTML/ js 數(shù)組合并問題

js 數(shù)組合并問題

業(yè)務(wù)描述,在日歷上顯示一個(gè)月跑步的日期
日歷這快完全是用前端js實(shí)現(xiàn)的,所以只需要后臺(tái)給一個(gè)跑步日期的數(shù)組插進(jìn)日歷的數(shù)組里就行了,我的思路是做兩層循環(huán),但是這樣計(jì)算量很大,有沒有更好的方法?

后臺(tái)返回一個(gè)月中跑步的日期

[1,4,6,8,21]

前端某月 日歷數(shù)組

[{day:1},{day:2}......{day:31}]

希望合并的最后的結(jié)果是

[{day:1,isrun:false},{day:2,isrun:false}...{day:4,isrun:true}...{day:6,isrun:true}....{day:31,isrun:false}]
回答
編輯回答
糖果果

首先,反對(duì)推薦答案,indexOf只是語法糖,內(nèi)部還是循環(huán)

如果這樣做,我想了很久,沒有想到什么好辦法,
但是上面的答案也絕對(duì)不對(duì),你想下map、indexOf、include這些方法內(nèi)部原理是不是還是循環(huán)?
只是被封裝的很好,使你的代碼看起來很優(yōu)雅。

那么,我們換個(gè)思路

let days = [2, 4, 5, 7];
let run = [{ day: 1 }, { day: 2 }......{ day: 31 }];
for(let i=0;i<days.length;i++){
  run[days[i]-1].isrun=true;
}

run數(shù)組里的下標(biāo)是可以利用起來的,實(shí)際天數(shù)-1就是下標(biāo)

寫之前沒注意看 我贊同 @yszou 的答案,只有這樣才能實(shí)現(xiàn)單層循環(huán),其他的全是語法糖包裝,實(shí)質(zhì)運(yùn)算量并沒有減少

2017年11月4日 23:09
編輯回答
護(hù)她命

var run = [1,4,6,8,21];
var day = [{day:1},{day:2},{day:3},{day:4}];
var res = day.map(item => {

item && item.day && item.isrun = run.indexOf(item.day) > -1;
return item;

})
console.log(res)

2017年1月14日 13:01
編輯回答
瘋浪

同步運(yùn)行。但盡量減少變量新增和數(shù)組遍歷??赡軙?huì)快一點(diǎn)吧。

var runDay = [1,4,6,8,21];
var cand = [{day:1},{day:2}......{day:31}];
var i = 0, len = runDay.length;
for (;i<len;i++) {
    cand[runDay[i] - 1].run = true;
}
i = 0;
len = cand.length;
for (;i<len;i++) {
    //對(duì)下面這兩種不太了解哪種效率速度更快
    //case1
    cand[i].run = !!cand[i].run;
    //case2
    if (!cand[i].run) {
        cand[i].run = false;
    }
}
2017年9月24日 01:28
編輯回答
玩控

有這么復(fù)雜

var day = [1,4,6,8,21];
  var run  = [{day:1},{day:2},{day:3},{day:4}];
 console.log(run.map(item =>(day.indexOf(item.day)>=0?item.isrun=true:item.isrun=false,item))) ;
2018年9月16日 00:17
編輯回答
愚念

贊同 @阡陌夕殤 的答案。

在此,想額外補(bǔ)充一點(diǎn)的是,這個(gè)問題實(shí)質(zhì)上是關(guān)于時(shí)間復(fù)雜度的問題,問題中時(shí)間復(fù)雜度為O(n^2),那應(yīng)該如何去降低這個(gè)時(shí)間復(fù)雜度?

另外,還有空間復(fù)雜度的問題。

2018年5月22日 02:21
編輯回答
墻頭草

這么點(diǎn)數(shù)據(jù)量,不要考慮性能問題。可讀性更重要。

const days = [1,4,6,8,21]
const result = [...Array(31)].map((u, i) => ({day: i + 1, run: days.includes(i + 1)}))
2017年7月8日 18:30
編輯回答
陌璃
var a = [1,4,6,8,21];
var b = [{day:1},{day:2}......{day:31}];

確保 b 是事個(gè)“完整”的列表,這個(gè)前提下, a 的成員的值,就是 b 的成員的索引值。

即:

$.map(a, function(v){ b[v-1].isrun = true });
2017年5月3日 10:25
編輯回答
櫻花霓
<script>
    var day = [1,4,7];
    var data = [
        {day:1},
        {day:2},
        {day:3},
        {day:4},
        {day:5},
        {day:6},
        {day:7},
        {day:8}
    ]
    
    var newArr = [];
    
    for(var a=0;a<data.length;a++) {
        newArr.push({
            day: data[a].day,
            isrun: day.indexOf(data[a].day) != -1 ? true : false
        });
    }
    
    console.log(newArr);
</script>
2017年1月18日 15:21
編輯回答
礙你眼
// 兩層循環(huán)?一層即可呀。
let dayArr = [1,4,6,8];
let arr = [{day:1},{day:2},{day:3}];
let result = arr.map((item) => {
    if(dayArr.indexOf(item.day) > -1){
        item.isrun = true;
    }else{
        item.isrun = false;
    }
    // 當(dāng)前這塊可以用ES7的includes簡化
    // item.isrun = dayArr.includes(item.day);
    // 或者
    // item.isrun = dayArr.indexOf(item.day) > -1;
    return item;
})
console.log(result); // [{day: 1, isrun: true},{day: 2, isrun: false},{day: 3, isrun: false}]
2017年10月25日 06:50
編輯回答
遲月
let dayArr = [1,4,6,8,21]
let result = Array(30).fill(0).map((v,i) => { num:i+1, isrun:false })
dayArr.forEach((v) => result[v-1].isrun = true)
2017年7月12日 21:49