2017-03-15 268 views
1

裏面我有一個JavaScript對象,它是DYNAMICALLY CREATED這樣添加到陣列陣列

[ 
    {"user":"James","errors":["signature must be signed!"]}, 
    {"user":"Jones","errors":["signature must be signed!"]} 
] 

我試圖在該對象內的errors陣列動態添加新的錯誤。

這是我曾嘗試:

validationErr.push({ "user" : "James", "errors" : ["start time musst be filled!"] }); 

但我得到一個新條目

[ 
    {"user":"James","errors":["signature must be signed!"]}, 
    {"user":"Jones","errors":["signature must be signed!"]}, 
    {"user" : "James", "errors" : ["start time musst be filled!"]} 
] 

,而不是這個

[ 
    {"user":"James","errors":["signature must be signed!", "start time musst be filled!"]}, 
    {"user":"Jones","errors":["signature must be signed!"]}, 
] 

我如何可以添加到裏面現有陣列我目的?

回答

1

這是一個有點難看,但你可以實現你想假設你有獨特的用戶和errors領域從來都不是不確定的東西;

function func(arr, idField, id, updField, upd) { 
 
    arr.find(obj => obj[idField] == id)[updField].push(upd); 
 
} 
 

 
validationErr = [ 
 
    {"user":"James","errors":["signature must be signed!"]}, 
 
    {"user":"Jones","errors":["signature must be signed!"]} 
 
]; 
 

 
func(validationErr, "user", "James", "errors", "start time must be filled!"); 
 

 
console.log(validationErr);

使用find()拿到第一次出現與正確的用戶名,並推入其陣,用一行代碼。

+0

這是0也硬編碼? – lewis4u

+0

@ lewis4u是的,如果用戶== James是唯一的,你會在過濾後得到一個單獨的數組,所以需要使用該選擇器獲取它。 –

+0

如果我的對象是動態創建的呢? – lewis4u

0

您應該用該特定鍵將物體推入內部。

那麼你的語法必須

validationErr[0].errors.push("start time musst be filled!"); 

哪裏validationErr[0]爲您提供了與詹姆斯對象,並推到他的錯誤。

+0

你不能用這種方法嗯它是動態創建的,所以我認爲這不會是一個很好的解決方案,因爲你的解決方案是硬編碼的! – lewis4u

3

不幸的是,它不能這樣工作。您需要專門在陣列中查找正確的對象,並將錯誤字符串添加到錯誤數組中。

var data = [ 
 
    {"user":"James","errors":["signature must be signed!"]}, 
 
    {"user":"Jones","errors":["signature must be signed!"]} 
 
] 
 

 

 
var addError = function(username, error){ 
 

 
    //Loop through you data array 
 
    data.forEach(function(obj){ 
 
    //for each obj in the data array, 
 
    //check to see if the objects user is equal to the username 
 
    if(obj.user === username){ 
 
     //Add error to that objects error array 
 
     obj.errors.push(error); 
 
    } 
 
    }) 
 
} 
 

 
addError("James", "error occured"); 
 
console.log(data)

+0

什麼是'return false;'處理['Array#forEach'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)? –

+0

@NinaScholz肯定已經將它與jQuery的每個函數混淆了。 – rottenoats

2

您可以使用Array#sort迭代陣列並找到合適的用戶。然後推送錯誤並退出循環。

如果找不到用戶,則使用errors數組創建一個新對象。

function addError(user, error) { 
 
    if (!data.some(function (a) { 
 
     if (a.user === user) { 
 
      a.errors.push(error); 
 
      return true; 
 
     } 
 
    })) { 
 
     data.push({ user: user, errors: [error] }); 
 
    } 
 
} 
 

 
var data = [{ user: "James", errors: ["signature must be signed!"] }, { user: "Jones", errors: ["signature must be signed!"] }]; 
 

 
addError("James", "start time musst be filled!"); 
 
addError("foo", "bar"); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

ES6與Array#find

function addError(user, error) { 
 
    var object = data.find(a => a.user === user); 
 
    if (object) { 
 
     object.errors.push(error); 
 
    } else { 
 
     data.push({ user, errors: [error] }); 
 
    } 
 
} 
 

 
var data = [{ user: "James", errors: ["signature must be signed!"] }, { user: "Jones", errors: ["signature must be signed!"] }]; 
 

 
addError("James", "start time musst be filled!"); 
 
addError("foo", "bar"); 
 

 
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

也許我在創建對象時犯了一個錯誤?高拉夫答案呢? – lewis4u

+0

這是一個不同問題的答案。 –

2

一個簡單而有效的方法來做到這一點是:

validationErr[validationErr.map((e)=>e.user).indexOf('James')].errors.push("value"); 

或這樣

validationErr[validationErr.findIndex(e => e.user === 'James')].errors.push("value"); 

這發生0.03毫秒 VS 查找歷時0.07毫秒()方法的方法。 平均快200%

雖然,最快的方法是使用鍵值對,但因爲你的對象被動態生成

var ValidationErr = {}; 
 

 
ValidationErr['James'] = []; 
 
ValidationErr['Robby'] = []; 
 
ValidationErr['James'].push("Not Authenticated"); 
 
ValidationErr['James'].push("Wrong Credentials"); 
 
ValidationErr['Robby'].push("No Error"); 
 

 
console.log(ValidationErr['James']);

+0

誰降低了這個?我想聽到更多的評論,因爲我覺得這也是一個很好的解決方案! – lewis4u

+0

@ lewis4u我修改了我的答案。之前,我沒有仔細閱讀這個問題,因爲我當時很匆忙。希望能幫助到你! –