Как отфильтровать массив в ответе json на основе проверки состояния с ключами в angular 7 - PullRequest
1 голос
/ 14 апреля 2020

Я хотел бы получить фильтрацию конкретного массива только из ответа json, когда dataID не сопоставляется с ParentDataID из другого массива в том же ответе json с использованием функции машинописи в Angular 7

{ "data":[
    {
       "dataId":"Atlanta",
       "parentDataId":"America"
    },
    {
       "dataId":"Newyork",
       "parentDataId":"America"
    },
    {
       "dataId":"Georgia",
       "parentDataId":"Atlanta"
    },
    {
       "dataId":"South",
       "parentDataId":"Atlanta"
    },
    {
       "dataId":"North",
       "parentDataId":"South"
    }
   ]
}

В ответе выше значение dataId Newyork не сопоставляется ни с одним ответом всего массива parentDataId json. Итак, теперь я хочу отфильтровать только второй массив DataID для создания нового массива.

Я хотел бы иметь эту проверку в Typescript angular 7

Предполагается, что мой вывод похож на ниже ... У DataId нет parentDataId

[
  {
    "dataId":"Newyork",
    "parentDataId":"America"
  },
  {
     "dataId":"Georgia",
     "parentDataId":"Atlanta"
   },
   {
      "dataId":"North",
      "parentDataId":"South"
     }
]

Ценим помощь и ответ

Ответы [ 3 ]

2 голосов
/ 14 апреля 2020

Вы можете использовать filter метод:

let filterKey = 'Atlanta';
const result = data.data.filter(f=> f.parentDataId != filterKey
   && f.dataId != filterKey);

Пример:

let data = { "data":[
    {
       "dataId":"Atlanta",
       "parentDataId":"America"
    },
    {
       "dataId":"Newyork",
       "parentDataId":"America"
    },
    {
       "dataId":"Georgia",
       "parentDataId":"Atlanta"
    }
   ]
};

let filterKey = 'Atlanta';
const result = data.data.filter(f=> f.parentDataId != filterKey
    && f.dataId != filterKey);
console.log(result);
1 голос
/ 14 апреля 2020

демо в этом StackBlitz Link

мое решение похоже на фрагмент кода ниже. ts

reducedData = [...this.data];

this.data.reduce((c,n,i) => {
   this.data.reduce((d,o, inex) =>  { 
      if ( n.dataId === o.parentDataId){ 
           this.reducedData.splice(i,1, {'dataId': 'removed', parentDataId: 'true'}); 
      } else {
         return o;
      }
    },{});
   return n;
}, {});   

this.reducedData = this.reducedData.filter (value => value.dataId !== 'removed');

html file

<code><h4> dataId does not have parentId </h4>
<hr>
<pre>
  {{reducedData | json}}

EDIT

Если вы не хотите использовать второй объект reducedData, тогда нижеприведенное решение хорошо работает. StackBlitz Link

component.ts

this.data.reduce((c,n,i) => {
    this.data.reduce((d,o, inex) =>  { 
      if ( n.dataId === o.parentDataId) {
      this.data[i]['removed'] = "removed";
      } else{
        return o;
      }
    },{});
   return n;
}, {});

this.data = this.data.filter (value => value['removed'] !== 'removed');

компонент. html

<code><h4> dataId does not have parentId </h4>
<hr>
<pre>
 {{data |json}}
0 голосов
/ 14 апреля 2020

Пожалуйста, попробуйте вот так.

const data = { "data":[
    {
       "dataId":"Atlanta",
       "parentDataId":"America"
    },
    {
       "dataId":"Newyork",
       "parentDataId":"America"
    },
    {
       "dataId":"Georgia",
       "parentDataId":"Atlanta"
    }
   ]
};

const filterKey = "Newyork"
const matchExist = data.data.some( item => item.parentDataId ===  filterKey && item.dataId === filterKey)
let filteredArray ;
if(!matchExist){
    filteredArray = data.data.find(item => item.dataId === filterKey )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...