繁体   English   中英

如何在不重复的情况下用javascript中的对象替换对象数组

[英]how to replace array of object with an object in javascript without repeating

let a = [{ name: "ben", age: 25 }, { name: "jeffrey", age: 10 },{ name: "daniel", age: 20 }]
let case1 = { name: "ben", age: 10 }
let case2={ name: "jack", age: 30 }

案例1:我希望结果是

[{ name: "ben", age: 10 }, { name: "jeffrey", age: 10 },{ name: "daniel", age: 20 }]

“ben”存在的地方,所以它将年龄替换为 10

案例2:我希望结果是

[{ name: "ben", age: 25 }, { name: "jeffrey", age: 10 },{ name: "daniel", age: 20 },{ name: "jack", age: 30 }]

其中“jack”不在数组中,因此它添加到数组中

如何编写执行此功能的函数

也可以用for循环来完成。

 function untitled(original, newObj) { for (let index = 0; index < original.length; index++) { if (original.name && newObj.name === a[index].name) { original[index] = {...newObj}; console.log(original); return; } } original.push(newObj); console.log(original); } let a = [{ name: "ben", age: 25 }, { name: "jeffrey", age: 10 },{ name: "daniel", age: 20 }] let case1 = { name: "ben", age: 10 } let case2 = { name: "jack", age: 30 } untitled(a, case1); untitled(a, case2);

你是Array.prototype.findIndex ( MDN ) 的一个很好的例子,它类似于Array.prototype.find但返回找到的索引而不是项目。

 let a = [{ name: "ben", age: 25 }, { name: "jeffrey", age: 10 },{ name: "daniel", age: 20 }] let case1 = { name: "ben", age: 10 } let case2 = { name: "jack", age: 30 } const arrayUpsert = function (array, object) { const objectIndex = array.findIndex(item => item.name == object.name) if (objectIndex == -1) { array.push(object) } else { array[objectIndex] = { ...array[objectIndex], ...object } } return array } console.log(arrayUpsert(a, case1)) console.log(arrayUpsert(a, case2)) /* [ { name: 'ben', age: 10 }, { name: 'jeffrey', age: 10 }, { name: 'daniel', age: 20 } ] [ { name: 'ben', age: 10 }, { name: 'jeffrey', age: 10 }, { name: 'daniel', age: 20 }, { name: 'jack', age: 30 } ] */

我在我的解决方案中使用 ramda 库:-

  • 检查键是否存在于数组中的任何对象中
    idx = R.findIndex(R.propEq('name', 'ben'), a) . 如果idx<0那么我们可以直接推送对象,否则进入下一步。

  • 我们有索引(idx),我们只需要做a[idx].age="--"

暂无
暂无

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

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