2017-03-15 59 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我修改了我的答案。之前,我没有仔细阅读这个问题,因为我当时很匆忙。希望能帮助到你! –