Обновление уже существующего массива и добавление новых данных в тот же массив - PullRequest
1 голос
/ 25 апреля 2020

Я хотел бы вывести sh массив значений в другой массив, но также при отправке данных, если уже есть существующие данные, он должен просто обновить существующие данные. Код напечатан.


class itemList{
    constructor(public name: string, public amount: number){}
}

function DisArr(Ar1: itemList[]){
    for(let item of Ar1){
        console.log(item.name + " -- " + item.amount);
    }
}

var Ar1 = [new itemList('Apple',3),
new itemList('Tomato',4),
new itemList('Jam',1)];

var Ar2 = [new itemList('Orange',3),
new itemList('Tomato',8),
new itemList('Grape',20)];

console.log("Array before updating : ");
DisArr(Ar1);
Ar1.push(...Ar2);
console.log("Array before updating : ");
DisArr(Ar1);

На данный момент вывод: * Массив перед обновлением: яблоко - 3 помидора - 4 варенья - 1

Массив после обновления: Apple - 3 помидора - 4 джема - 1 апельсин - 3 помидора - 8 винограда - 20 *

Но я хочу выводить как: * Массив до обновления: Apple - 3 помидора - 4 джема - 1

Массив после обновления: яблоко - 3 помидора - 12 джем - 1 апельсин - 3 винограда - 20 *

Как изменить код как получить желаемый вывод?

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

У меня есть другое решение использовать метод reduce и удалить дубликаты в Ar2 и concat их, как показано ниже

let result = Ar1.reduce((acc, item) => {
      let found = Ar2.find(c => c.name == item.name);
      if (found != undefined) {
        item.amount += found.amount;
        const index = Ar2.indexOf(found);
        if (index > -1) {
          Ar2.splice(index, 1);
        }
      }
      acc.push(item);
      return acc;
    }, []);

    result = result.concat(Ar2);

Демонстрация на stackbliz https://stackblitz.com/edit/angular-merge-array-reduce

0 голосов
/ 25 апреля 2020

Мой подход заключался в создании новой функции addToArrayOrIncrementAmount, которая принимает массив для изменения (contextArray) и массив новых значений для добавления (newArray).

Для каждого элемента в newArray проверьте, существует ли этот элемент в contextArray, используя свойство .name в качестве идентификатора (должен быть уникальный идентификатор). Если этот идентификатор не существует, чем pu sh новый элемент, в противном случае измените / увеличьте значение amount с помощью +=. Вызовите эту новую функцию, например, addToArrayOrIncrementAmount(Ar1, Ar2).

class itemList {
  constructor(public name: string, public amount: number) { }
}

function DisArr(Ar1: itemList[]) {
  for (let item of Ar1) {
    console.log(item.name + " -- " + item.amount);
  }
}

function addToArrayOrIncrementAmount(contextArray: itemList[], newArray: itemList[]) {
  newArray.forEach(product => {
    const index = contextArray.findIndex((e) => e.name === product.name);

    if (index === -1) {
      contextArray.push(product);
    } else {
      contextArray[index].amount += product.amount;
    }
  });
}

var Ar1 = [new itemList('Apple', 3),
  new itemList('Tomato', 4),
  new itemList('Jam', 1)
];

var Ar2 = [new itemList('Orange', 3),
  new itemList('Tomato', 8),
  new itemList('Grape', 20)
];

console.log("Array before updating : ");
DisArr(Ar1);
addToArrayOrIncrementAmount(Ar1, Ar2);
console.log("Array before updating : ");
DisArr(Ar1);

Это версия JavaScript, чтобы я мог вставить ее в ответ и продемонстрировать, как она работает, нажав «Выполнить фрагмент кода».

class itemList {
  constructor(name, amount) {
    this.name = name;
    this.amount = amount;
  }
}

function DisArr(Ar1) {
  for (let item of Ar1) {
    console.log(item.name + " -- " + item.amount);
  }
}

function addToArrayOrIncrementAmount(contextArray, newArray) {
  newArray.forEach(product => {
    const index = contextArray.findIndex((e) => e.name === product.name);

    if (index === -1) {
      contextArray.push(product);
    } else {
      contextArray[index].amount += product.amount;
    }
  });
}

var Ar1 = [new itemList('Apple', 3),
  new itemList('Tomato', 4),
  new itemList('Jam', 1)
];

var Ar2 = [new itemList('Orange', 3),
  new itemList('Tomato', 8),
  new itemList('Grape', 20)
];

console.log("Array before updating : ");
DisArr(Ar1);
addToArrayOrIncrementAmount(Ar1, Ar2);
console.log("Array before updating : ");
DisArr(Ar1);
0 голосов
/ 25 апреля 2020

Я сделал некоторые изменения в коде, и я получаю требуемый ответ, но не уверен, что это лучшее решение. Если у кого-то есть лучшее решение, пожалуйста, оставьте свой ответ.


class itemList{
    constructor(public name: string, public amount: number){}
}

function DisArr(Ar1: itemList[]){
    for(let item of Ar1){
        console.log(item.name + " -- " + item.amount);
    }
}

var Ar1 = [new itemList('Apple',3),
new itemList('Tomato',4),
new itemList('Jam',1)];

var Ar2 = [new itemList('Orange',3),
new itemList('Tomato',8),
new itemList('Grape',20)];

console.log("Array before updating : ");
DisArr(Ar1);

var delAr = [];
for(let i=0; i<Ar2.length; i++){
    for(let obj of Ar1){
        if(obj.name === Ar2[i].name){
            obj.amount += Ar2[i].amount;
            delAr.push(i);
        }
    }
}
for(let no of delAr){
    Ar2.splice(no,1);
}
Ar1.push(...Ar2);


console.log("Array before updating : ");
DisArr(Ar1);
---
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...