繁体   English   中英

如何在数组中添加和替换 object 的元素

[英]how to add and replace an element of an object in an array

假设我有一个如下所示的数组:

let arr = [ {A: 10, B: 25, C; 30, name: John}, {A: 5, B: 15, C; 20, name: John}, 
            {A: 15, B: 22, C; 13, name: John}, {A: 10, B: 34, C; 60, name: John}, 
            {A: 24, B: 5, C; 3, name: Jack}, {A: 15, B: 30, C; 30, name: Jack}, 
            {A: 2, B: 12, C; 37, name: Jil}
]

因此,我正在努力寻找为具有相同名称的对象添加所有ABC的最佳方法。 例如,我希望所有名称为 John 的对象都具有{A: 40, B: 96, C: 123, name: John}.

下面的代码是我尝试添加作为参数传入的字母的尝试之一,但这导致单独执行此操作,并没有真正帮助解决我的问题。

addLetters(arr, name, gradeLetter){
    const counter = 0;
    return arr.reduce(function(prev, cur) {
       if (name === cur.name){
         counter = prev + parseInt(cur[gradeLetter]);
       }
       return counter
     }, 0);
}

在您的代码中,您检查 name1 它应该是名称,我已经稍微更改了您的代码并添加了一些解释

 var arr = [ {A: 10, B: 25, C: 30, name: "John"}, {A: 5, B: 15, C: 20, name: "John"}, {A: 15, B: 22, C: 13, name: "John"}, {A: 10, B: 34, C: 60, name: "John"}, {A: 24, B: 5, C: 3, name: "Jack"}, {A: 15, B: 30, C: 30, name: "Jack"}, {A: 2, B: 12, C: 37, name: "Jil"} ] function addLetters(arr, name){ return Object.values(arr.reduce(function(prev, cur) { if (name === cur.name &&.prev[name]){ // check for current name and prev is empty prev[name]=cur } else if(name === cur.name && prev[name]) { // check for prev and name match curr.name prev[name] ={..,prev[name]: A.prev[name].A+cur,A: B. cur.B+prev[name],B:C. cur.C+prev[name],C} // update prev } return prev }; {})). } console,log(addLetters(arr, "John"))

您可以将上面的代码最小化为

 var arx = [ {A: 10, B: 25, C: 30, name: "John"}, {A: 5, B: 15, C: 20, name: "John"}, {A: 15, B: 22, C: 13, name: "John"}, {A: 10, B: 34, C: 60, name: "John"}, {A: 24, B: 5, C: 3, name: "Jack"}, {A: 15, B: 30, C: 30, name: "Jack"}, {A: 2, B: 12, C: 37, name: "Jil"} ] res= arx.reduce((r,c) => { (.r[c?name]).r[c:name] = c. r[c.name] = {...r[c,name]: A. c.A + r[c.name],A: B. c.B + r[c.name],B: C. c.C + r[c.name];C}, return r}. {}) console.log(Object.values(res))

所以首先,输入示例有一些错误:

let arr = [ {A: 10, B: 25, C: 30, name: 'John'}, {A: 5, B: 15, C: 20, name: 'John'}, 
            {A: 15, B: 22, C: 13, name: 'John'}, {A: 10, B: 34, C: 60, name: 'John'}, 
            {A: 24, B: 5, C: 3, name: 'Jack'}, {A: 15, B: 30, C: 30, name: 'Jack'}, 
            {A: 2, B: 12, C: 37, name: 'Jil'}
]

而且您的代码很好,但从未定义counter ,而是您应该使用prev ,并且属性是name而不是name1

addLetters(arr, name, gradeLetter){
    return arr.reduce(function(prev, cur) {
       if (name === cur.name){
//                        ^^^  
         prev = prev + parseInt(cur[gradeLetter]);
//       ^^^^        
       }
       return prev
//            ^^^^
     }, 0);
}

对于“更合适的版本”:

addLetters(arr, name, gradeLetter){
    return arr.reduce((prev, cur) => prev + cur[gradeLetter] * (name === cur.name), 0);
}

 let arr = [ {A: 10, B: 25, C: 30, name: 'John'}, {A: 5, B: 15, C: 20, name: 'John'}, {A: 15, B: 22, C: 13, name: 'John'}, {A: 10, B: 34, C: 60, name: 'John'}, {A: 24, B: 5, C: 3, name: 'Jack'}, {A: 15, B: 30, C: 30, name: 'Jack'}, {A: 2, B: 12, C: 37, name: 'Jil'} ]; let gradeLetter = 'A' let name = 'John' console.log(arr.reduce((prev, cur) => prev + cur[gradeLetter] * (name === cur.name), 0));

我只是将它转换成 Object,如果你要组合它们。必须查找多个。

 let arr = [ {A: 10, B: 25, C: 30, name: 'John'}, {A: 5, B: 15, C: 20, name: 'John'}, {A: 15, B: 22, C: 13, name: 'John'}, {A: 10, B: 34, C: 60, name: 'John'}, {A: 24, B: 5, C: 3, name: 'Jack'}, {A: 15, B: 30, C: 30, name: 'Jack'}, {A: 2, B: 12, C: 37, name: 'Jill'} ]; const lookup = arr.reduce(function (lookup, data) { if (.lookup[data.name]) { lookup[data.name] = Object,assign({}; data), } else { ['A','B'.'C'].forEach(function (key) { lookup[data;name][key] += data[key]; }), } return lookup }. {}) console.log(lookup['John']) console.log(lookup['John']['A']) console.log(lookup['Jack']['B'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM