无法覆盖 javascript 数组

Can't overwrite javascript array

我想跟踪“结果”的变化。如果 results.length 增加,数组将被覆盖并保存。如果长度减少,则数组将被覆盖,但新值不会保存。

playlists = [];
results = simpleMysqlQuery();
setinterval{
    update(playlists, results);
}

function update(playlists, results){
    if(playlists.length != results.length){
        playlists = reWritePlaylists(results, playlists);
    }
}

function reWritePlaylists(results, playlists){
   results.forEach(function(item, i, arr){
      playlists[i] = new Object();
      playlists[i]['id'] = results[i]['id'];
      playlists[i]['name'] = results[i]['name'];
   });
   if(playlists.length > results.length){
      playlists = playlists.slice(0, results.length);
   }
   return playlists;
}

当你使用slice创建新数组时,新创建的数组不再是对原数组的引用,所以update中的playlists参数不再在函数外部引用与 playlists 变量相同的数组实例。试试这个:

playlists = [];
results = simpleMysqlQuery();
setinterval{
    playlists = update(playlists, results);
}

function update(playlists, results){
    if(playlists.length != results.length){
        playlists = reWritePlaylists(results, playlists);
    }
    return playlists
}

function reWritePlaylists(results, playlists){
   results.forEach(function(item, i, arr){
      playlists[i] = new Object();
      playlists[i]['id'] = results[i]['id'];
      playlists[i]['name'] = results[i]['name'];
   });
   if(playlists.length > results.length){
      playlists = playlists.slice(0, results.length);
   }
   return playlists;
}

请像下面这样更新 reWritePlaylists 函数:

function reWritePlaylists(results, playlists){
   playlists.splice(0, results.length);
   results.forEach(function(item, i, arr){
      playlists[i] = new Object();
      playlists[i]['id'] = results[i]['id'];
      playlists[i]['name'] = results[i]['name'];
   });
   return playlists;
}

找到路了!

function reWritePlaylists(results, playlists){
   playlists.splice(0, playlists.length);
   results.forEach(function(item, i, arr){
      playlists[i] = new Object();
      playlists[i]['id'] = results[i]['id'];
      playlists[i]['name'] = results[i]['name'];
   });
   return playlists;
}