JavaScript добавить или заменить объект путем проверки свойства внутри другого массива объектов

1

Я хочу добавить или заменить объект внутри другого массива.

var arr = [
  {uid: 1, name: "bla", description: "cucu"},
  {uid: 2, name: "smth else", description: "cucarecu"},
]

здесь вот новый объект:

var mynewObject = {uid: 1, name: "newBlabla", description: "newDesc"};

я уже делаю это как:

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;
} 

но это очень уродливо. есть ли способ сделать это в одной строке или двух?

исходный массив должен оставаться массивом, а новый объект должен быть проверен только с помощью свойства uid.

  • 1
    Почему это некрасиво? Вам нужно какое-то условие
  • 0
    Вопросы о рефакторинге или оптимизации рабочего кода лучше подходят на codereview.stackexchange.com . Этот сайт предназначен для исправления кода, который не работает должным образом
Показать ещё 1 комментарий
Теги:
ecmascript-6
arrays

2 ответа

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));

Или немного более кратким, если вам не нужно возвращать массив:

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);
  • 0
    Когда необходимо добавить новый объект в массив, функция возвращает новую длину массива вместо самого массива.
0
const addOrReplace = (arr, obj) => {
    arr = arr.filter(el => el.uid !== obj.uid);
    arr.push(obj)
    return arr;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню