javascript在另一个对象数组中通过属性检查添加或替换对象

tee*_*tee 1 javascript arrays ecmascript-6

我想在另一个数组中添加或替换一个对象.

var arr = [
  {uid: 1, name: "bla", description: "cucu"},
  {uid: 2, name: "smth else", description: "cucarecu"},
]
Run Code Online (Sandbox Code Playgroud)

这里是一个新对象:

var mynewObject = {uid: 1, name: "newBlabla", description: "newDesc"};
Run Code Online (Sandbox Code Playgroud)

我已经这样做了:

function addOrReplace (arr, object) {
  var index = arr.findIndex(x => object.uid === x.uid);
  if (-1 === index) {
    arr.push(object);
  } else {
    arr[index] = object;
  }
  return arr;
} 
Run Code Online (Sandbox Code Playgroud)

但这非常难看.有没有办法在一行或两行中完成?

原始数组应保持为数组,并且只应按属性检查新对象uid.

Ric*_*ick 6

要实现相同的功能,但要使其更加简洁一行,运行Array#findIndex并将其结果分配给idx函数的未使用参数(有效地覆盖其值,undefined默认情况下,或函数,使用该函数)被调用),然后使用一个简单的三元运算符来修改现有对象或添加到数组,最后返回修改后的数组.

const arr1 = [
  { uid: 1, name: "bla", description: "cucu" },
  { uid: 2, name: "smth else", description: "cucarecu" },
]
const mynewObject1 = { uid: 1, name: "newBlabla", description: "newDesc" };

const arr2 = [
  { uid: 2, name: "smth else", description: "cucarecu" },
]
const mynewObject2 = { uid: 1, name: "newBlabla", description: "newDesc" };

const arr3 = []
const mynewObject3 = { uid: 1, name: "newBlabla", description: "newDesc" };

function addOrReplace (arr, obj, idx) {
  return (idx = arr.findIndex(x => obj.uid === x.uid) > -1 ? arr[idx] = obj : arr.push(obj)), arr;
}

console.log(addOrReplace(arr1, mynewObject1));
console.log(addOrReplace(arr2, mynewObject2));
console.log(addOrReplace(arr3, mynewObject3));
Run Code Online (Sandbox Code Playgroud)

或者如果您不需要返回数组则更简洁:

const arr1 = [
  { uid: 1, name: "bla", description: "cucu" },
  { uid: 2, name: "smth else", description: "cucarecu" },
]
const mynewObject1 = { uid: 1, name: "newBlabla", description: "newDesc" };

const arr2 = [
  { uid: 2, name: "smth else", description: "cucarecu" },
]
const mynewObject2 = { uid: 1, name: "newBlabla", description: "newDesc" };

const arr3 = []
const mynewObject3 = { uid: 1, name: "newBlabla", description: "newDesc" };

function addOrReplace (arr, obj, idx) {
  idx = arr.findIndex(x => obj.uid === x.uid) > -1 ? arr[idx] = obj : arr.push(obj);
}

addOrReplace(arr1, mynewObject1)
console.log(arr1);

addOrReplace(arr2, mynewObject2)
console.log(arr2);

addOrReplace(arr3, mynewObject3)
console.log(arr3);
Run Code Online (Sandbox Code Playgroud)