rxjs / Angular2 Цикл, но показывает другой объект одного ассоциативного массива - PullRequest
0 голосов
/ 13 июня 2018

Я недавно объединил два массива, используя rxjs

  MyArray =  [{
        "Field": ["Cars"],
        "Type": ["BMW", "Toyota", "Volvo"]
          },
         {
        "Field": ["House"],
        "Type": ["Condominium", "TownHouse"],
         }


   PriceArray = [
             {
            field: Cars,
            distribution: [{"name" : "BMW","price":2},{"name" : "Toyota","price":3}]
            },
            {
            field: People,
            distribution: [{"name" : "Condominium","price":3},{"name" : "TownHouse","price":2}]
           }]

, используя фильтр rxjs

const $MergeData = MyArray.map(val => {
  return Object.assign({}, val,this.PriceArray.filter(v => v.Field === val.field)[0])
});
 this.mergedArray = $MergeData;

Теперь это выглядело так ..

mergedArray =  [{
    "Field": "Cars",
    "Type": ["BMW", "Toyota", "Volvo"],
    "field" : "Cars",
    "distribution" : [ 
        {
         "name" : "BMW"
         "price": 2 ,
        },
        {
         "name" : "Toyota"
         "price": 3 ,
        },
        {
         "name" : "Toyota"
         "price": 4 ,
        }
       ]
    }, .... (house array here)];

Затем я попыталсяпоказать цену товара, но она не работает

<div *ngFor="let item of mergedArray">  
    <div *ngFor="let car of item.Field; let i = index"> 
        <p>{{car}} </p>
        <p>{{item.distribution.price[i]}} </p>
    </div>
</div>

Я надеюсь исправить ситуацию или лучше, если вместо этого массив будет выглядеть следующим образом

mergedArray =  [{
    "Field": "Cars",
     "Type": ["BMW": 2, "Toyota" : 3, "Volvo" : 4],
    }]

Надеюсь, что это возможно, как естьгораздо проще зацикливаться.

1 Ответ

0 голосов
/ 13 июня 2018

Я думаю, что это желаемый эффект, также имейте в виду, что при использовании Array.prototype.filter, когда ни один элемент не проходит тест, возвращаемое значение будет [], и если вы попытаетесь получить доступ к элементу [][0], значениебудет undefined, после этого, если вы попытаетесь получить доступ к некоторому свойству из этого значения undefined, будет выдано сообщение об ошибке.

Например, если вы попытаетесь получить доступ к цене Volvo, будет выдано сообщение об ошибке.Cannot read property 'price' of undefined, потому что Volvo не существует в PriceArray

let priceArray = [ 
        {
         "name" : "BMW",
         "price": 2 
        },
        {
         "name" : "Toyota",
         "price": 3 
        },
        {
         "name" : "Toyota",
         "price": 4 
        }
       ];

let myArray =  [{
        "Field": "Cars",
        "Type": ["BMW", "Toyota", "Volvo"]}]

let findPrice= (priceArray,mark)=> priceArray
  .find(x=> x.name === mark) 
  ? priceArray.find(x=> x.name === mark).price 
  : 'No data'


let mergedArray = myArray[0].Type.map(x=> ({[x]:findPrice(priceArray,x)}))

console.log(mergedArray)
...