Как вернуть объекты, уникальные на основе LocId, из любой точки? - PullRequest
0 голосов
/ 12 июля 2020

Я работаю над angular 7 Я столкнулся с проблемой: я не могу вернуть отдельные или уникальные объекты на основе LocId.

Мне нужно вернуть объект, уникальный из массива объектов all Locations.

allLocations:any[]=[];
ngOnInit()
{

this.locationsService.allLocations.forEach(loc => {
      let d = this.locationsService.allLocations.findIndex(x => x.Locid == loc.Locid);
      if (d !== -1) {
        this.locationsService.allLocations.splice(d, 1);
}

и код компонента html, как показано ниже:

<tr  *ngFor="let l of locationsService.allLocations">
                <td class="z2-boxstyle1-td-colcontent">
                  <div> {{l.Locid}} </div>
                </td>
</tr>

результат массива:

[
{"Locid":40903,"GPS1":"42.5913974,-71.3277873","CompanyID":1000339},
{"Locid":40900,"GPS1":"42.588432,-71.31720900000001","CompanyID":1000339}
{"Locid":40900,"GPS1":"42.588432,-71.31720900000001","CompanyID":1000339}
]

Поскольку Locid одинаков для двух объектов, поэтому я возвращаю отдельный и он должен быть таким, как показано ниже:

Ожидаемый результат:

[
{"Locid":40903,"GPS1":"42.5913974,-71.3277873","CompanyID":1000339},
{"Locid":40900,"GPS1":"42.588432,-71.31720900000001","CompanyID":1000339}
]

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Можно фильтровать по Locid

var newArr = arr.filter((x, index, self) =>
  index === self.findIndex((t) => (t.Locid === x.Locid )));

console.log(newArr);
0 голосов
/ 12 июля 2020

Причина в том, что порядок элементов в массиве изменяется, как только вы .splice его.

Похоже, что вы просто не хотите дублировать значения.

Вы можете сделать что-то подобное, используя .reduce:

var res = this.locationsService.allLocations.reduce((a,v)=>{
  if(!a[v.Locid]){
    a[v.Locid] = v;
  }
return a
},{});

console.log(Object.values(res));

Или вы можете просто взять пустой список, продолжая вставлять в него значения из this.locationsService.allLocations, пока Locid любого из элемент в этом списке там еще не найден. (2 прохода)

Или вы можете использовать .filter и .findIndex для выполнения задания. (2 прохода)

Однако я бы НЕ рекомендовал эти подходы, поскольку для них потребуется два прохода, а .reduce с одним проходом будет работать лучше.

...