Удалить часть JSON набора данных - PullRequest
0 голосов
/ 11 марта 2020

У меня есть JSON набор данных, и мне нужно удалить определенную его часть на основе значения, которое у меня есть в другом наборе данных.

Это набор данных (this.portfolioOptionsData), который я хотел бы удалить из.

[
    {
        "investmentStrategy": "Comprehensive",
        "selectedDefault": null,
        "portfolioDetail": [
            {
                "id": 9,
                "portfolioNames": "AFRF Accelerator portfolio",
                "riskRating": {
                    "conservative": false,
                    "aggressive": true,
                    "moderate": false
                },
                "managements": "Active"
            }
        ]
    },
    {
        "investmentStrategy": "Lifestage",
        "selectedDefault": null,
        "portfolioDetail": [
            {
                "id": 1,
                "portfolioNames": "AF High Growth portfolio",
                "riskRating": {
                    "conservative": false,
                    "aggressive": true,
                    "moderate": false
                },
                "managements": "Active"
            }
        ]
    }
]

Значение, которое я проверяю, является investmentStrategy.

Следующий набор данных, где я могу проверить, что investmentStrategy

{
  "defaultOptionId": 1,
  "hasClarity": null,
  "hasSinglePortfolio": null,
  "isComprehensive": false,
  "isLifestage": true,
  "lifestage": {
    "isBalanced": true,
    "isPassive": true,
    "isSpecialist": true
  },
  "portfolioOptionId": null,
  "defaultLabelName": "Lifestage – Passive"
}

Так что в этом случае я вижу, что "isLifestage": true, что означает, что мне нужно удалить comprehensive часть из первого набора данных.

{
  "investmentStrategy": "Comprehensive",
  "selectedDefault": null,
  "portfolioDetail": [
    {
     "id": 9,
     "portfolioNames": "AFRF Accelerator portfolio",
     "riskRating": {
     "conservative": false,
     "aggressive": true,
     "moderate": false
    },
      "managements": "Active"
    }
   ]
}

Есть какие-нибудь идеи, как я могу go об этом?

Я пробовал следующее, которое соответственно удаляет данные, но я должен проверить каждое значение investmentStrategy вручную? Есть ли более простой способ?

if (this.isLifestage) {this.portfolioOptionsData.splice (0,1); console.log («новая база» + JSON .stringify (this.portfolioOptionsData)); }

1 Ответ

0 голосов
/ 11 марта 2020

Итак, у вас есть массив, из которого вы хотите удалить некоторые элементы на основе условия.

Простая проблема Javascript требует простого решения Javascript (с небольшим количеством Typescript для забавы).

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

private shouldKeep(check: { isComprehensive: boolean, isLifestage: boolean },
  item: { investmentStrategy: string }): boolean {
  return (check.isComprehensive && item.investmentStrategy === 'Comprehensive') || 
    (check.isLifestage && item.investmentStrategy === 'Lifestage');
}

Теперь вы можете вызывать эту функцию, используя любую функцию массива, которую вы будете sh. Вам просто нужно подумать о , как вы собираетесь удалять элементы.

У вас есть 2 варианта:

  1. Удалить из исходного массива
  2. Создание нового массива с сохранением только элементов

Вы должны сохранить исходный массив, если на него ссылается что-либо еще.

1. Удалить из исходного массива

Используйте splice для удаления элементов из массива

for (let i = this.data.length - 1; i >= 0; i--) {
  if (!this.shouldKeep(this.check, this.data[i])) {
    this.data.splice(i, 1);
  }
}

2. Создайте новый массив

Используйте метод filter для копирования только элементов, которые вы хотите сохранить, в новый массив.

this.data = this.data.filter(x => this.shouldKeep(this.check, x));

3. Гибрид

Скопируйте элементы во временный массив, очистите исходный массив и снова скопируйте отфильтрованные элементы в исходный массив.

const filtered = this.data.filter(x => this.shouldKeep(this.check, x));
this.data.splice(0, this.data.length);
this.data.push(...filtered);

DEMO: https://stackblitz.com/edit/angular-id6l7q

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...