2017-08-21 3 views
0

j'ai le tableauListe des produits d'un tableau à base de ids d'un autre objet

[ 
    { 
    "id": "1", 
    "Name": "Name 1", 
    "Price": 10, 
    "inventory": 1, 
    "date_added": 1496757350 
    }, 
    { 
    "id": "2", 
    "Name": "Name 2", 
    "Price": 40, 
    "inventory": 1, 
    "date_added": 1496757290 
    }, 
... 
] 

et l'objet

{ 
'1':2, 
'2':15 
'10':5 
} 

comme ça. Ainsi, le premier contient les produits, et l'objet contient les identifiants des produits (clé), et combien de fois il a été ajouté au panier (valeur). Ce que je veux accomplir, c'est de lister les produits, dans un autre tableau d'objets, en fonction de l'objet. Donc, dans ce cas, il y aurait 3 produits dans cette liste. Je suis un peu perdu ici ... réduire, filtrer, cartographier ... Comment dois-je procéder? Merci

+3

Pouvez-vous montrer la sortie exacte que vous voulez créer, en fonction de la montre « entrée »? –

Répondre

1

Vous pouvez utiliser reduce pour faire une carte de vos produits par ID:

{ 
    id: { /* ... product */ } 
} 

Vous pouvez utiliser Object.keys et map itérer sur les ids dans votre panier:

Object.keys(cart).map(id => productMap[id]) 

Cela vous assure de boucler votre liste de produits une seule fois, au lieu d'une fois pour chaque article dans le panier. Notez également que vous pourriez tirer le meilleur parti de votre question si vous nous montrez les tentatives que vous avez faites. Savez-vous ce que font reduce et map?

const products = [ 
 
    { 
 
    "id": "1", 
 
    "Name": "Name 1", 
 
    "Price": 10, 
 
    "inventory": 1, 
 
    "date_added": 1496757350 
 
    }, 
 
    { 
 
    "id": "2", 
 
    "Name": "Name 2", 
 
    "Price": 40, 
 
    "inventory": 1, 
 
    "date_added": 1496757290 
 
    }, 
 
    { 
 
    "id": "10", 
 
    "Name": "Name 10", 
 
    "Price": 40, 
 
    "inventory": 1, 
 
    "date_added": 1496757290 
 
    } 
 
] 
 

 

 
const cart = { 
 
    "1": 2, 
 
    "2": 15, 
 
    "10": 5 
 
}; 
 

 
const productsById = products 
 
    .reduce((map, prod) => Object.assign(map, { [prod.id]: prod }), {}); 
 
    
 
const list = 
 
    Object 
 
    .keys(cart) 
 
    // Here, you can make any combination you like 
 
    // since both data are retrievable by id 
 
    
 
    // Only products: 
 
    //.map(id => productsById[id]); 
 
    
 
    // Combination 
 
    .map(id => ({ product: productsById[id], quantity: cart[id] })); 
 
     
 
console.log(list);

+0

Et après cela, comment puis-je joindre la quantité pour chaque produit? La liste après les ids fonctionne très bien, maintenant je dois joindre en quelque sorte la quantité aussi ... – Legycsapo

+1

Dans la dernière 'map', vous pouvez le récupérer de' cart'. Je vais l'ajouter à l'extrait. – user3297291

+0

Merci! Cela fonctionne maintenant! – Legycsapo

0
let result = products.filter(function(obj) { 
    return (Object.keys(quantityObject).indexOf(obj.id) !== -1); 
}); 

quelque chose comme ça? Le filtre vérifie si l'ID d'objet existe dans les clés de l'objet quantité et renvoie true ou false en fonction du résultat

1

Si vous souhaitez répertorier les produits disponibles dans un autre objet (qui utilise les ID de produit comme clés), vous devez filter

const products = [ 
 
    { 
 
    "id": "1", 
 
    "Name": "Name 1", 
 
    "Price": 10, 
 
    "inventory": 1, 
 
    "date_added": 1496757350 
 
    }, 
 
    { 
 
    "id": "2", 
 
    "Name": "Name 2", 
 
    "Price": 40, 
 
    "inventory": 1, 
 
    "date_added": 1496757290 
 
    }, 
 

 
] 
 

 
const ids = { 
 
'1': 2 
 
} 
 

 
console.log(products.filter(product => product.id in ids))

1

Vous pouvez filtrer les produits et construire un nouveau jeu de résultats avec la quantité de panier.

var products = [{ id: "1", Name: "Name 1", Price: 10, inventory: 1, date_added: 1496757350 }, { id: "2", Name: "Name 2", Price: 40, inventory: 1, date_added: 1496757290 }, { id: "4", Name: "Name 4", Price: 30, inventory: 1, date_added: 1496757290 }], 
 
    cart = { 1: 2, 2: 15, 10: 5 }, 
 
    selectedProducts = products.filter(function (o) { return o.id in cart; }); 
 

 

 
console.log(selectedProducts.map(function (o) { 
 
    return ['id', 'Name'].map(function (k) { 
 
     return k + ': ' + o[k]; 
 
    }).concat('count: ' + cart[o.id]).join('; '); 
 
}));

1

Vous pouvez créer un objet de sortie et ajouter l'élément avec le nombre de fois où il a été ajouté.

var items = [{ 
 
    "id": "1", 
 
    "Name": "Name 1", 
 
    "Price": 10, 
 
    "inventory": 1, 
 
    "date_added": 1496757350 
 
}, { 
 
    "id": "2", 
 
    "Name": "Name 2", 
 
    "Price": 40, 
 
    "inventory": 1, 
 
    "date_added": 1496757290 
 
}]; 
 

 
var cart = { 
 
    '1': 2, 
 
    '2': 15, 
 
    '10': 5 
 
} 
 

 
var output = {}; 
 

 
for (id in cart) { 
 
    item = items.find(x => x.id === id); 
 
    if (item != null) 
 
    output[id] = { 
 
     item: item, 
 
     count: cart[id] 
 
    }; 
 
} 
 
console.log(output);

1

Pour des raisons de vitesse, pour de recherche etc dans un tableau, je tends à créer une sorte d'index à l'aide d'un autre tableau associé. Quelque chose comme ci-dessous ..

var products = [ 
 
    { 
 
    "id": "1", 
 
    "Name": "Name 1", 
 
    "Price": 10, 
 
    "inventory": 1, 
 
    "date_added": 1496757350 
 
    }, 
 
    { 
 
    "id": "2", 
 
    "Name": "Name 2", 
 
    "Price": 40, 
 
    "inventory": 1, 
 
    "date_added": 1496757290 
 
    } 
 
]; 
 

 
var basket = 
 
{ 
 
    '1':2, 
 
    '2':15 
 
}; 
 

 
//first lets create a kind of index to products.. 
 
var ixProducts = products.reduce((a, v) => { a[v.id] = v; return a; }, {}); 
 

 
Object.keys(basket).forEach((k) => { 
 
    console.log({ 
 
    qty: basket[k], 
 
    product: ixProducts[k] 
 
    }); 
 
});