我有一个像这样的DYNAMICALLY CREATED
的javascript对象
[
{"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!"]},
]
如何在对象中添加现有数组?
答案 0 :(得分:3)
使用Array#find,destructuring和Array#push
的ES6解决方案
const data=[{user:"James",errors:["signature must be signed!"]},{user:"Jones",errors:["signature must be signed!"]}];
function addError(username, error){
const {errors} = data.find(({user})=>user===username);
if(errors){ errors.push(error) }
}
addError("James", "error occured");
console.log(data)
答案 1 :(得分: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; }
答案 2 :(得分:2)
一种简单而有效的方法是:
validationErr[validationErr.map((e)=>e.user).indexOf('James')].errors.push("value");
或者像这样
validationErr[validationErr.findIndex(e => e.user === 'James')].errors.push("value");
0.03 ms 与 find()方法相比, 0.07 ms 。 平均加快<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']);
&#13;
答案 3 :(得分:1)
您应该使用该特定键推入对象内部。
然后你的语法必须是;
validationErr[0].errors.push("start time musst be filled!");
validationErr[0]
在哪里为你提供詹姆斯的对象并推动他的错误。
答案 4 :(得分: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()
以正确的用户名获取第一个匹配项,并使用单行链接推入其数组。