添加到数组内的数组

时间:2017-03-15 09:30:55

标签: javascript jquery arrays

我有一个像这样的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!"]},
]

如何在对象中添加现有数组?

5 个答案:

答案 0 :(得分:3)

使用Array#finddestructuringArray#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%

虽然最快的方法是使用键值对但是你不能使用这种方法,因为你的对象是动态生成的

&#13;
&#13;
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;
&#13;
&#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()以正确的用户名获取第一个匹配项,并使用单行链接推入其数组。