2017-04-13 12 views
-1

配列に変換する必要がある3つの文字列があります。そこからフィルターをかけて、それらを結合したいのですが、私はZapierとそのjavascriptライブラリー少し限られているが、これは私がこれまで持っているものです。Javascript:配列を結合してフィルターする方法

文字列:

var type = 'bundle, simple, simple'; 
var name = 'Product1, Product2, Product3'; 
var price = '1.99, 2.99, 3.99'; 

私はJavaScriptを使用して、以下の配列に上記の上記の3つの文字列を変換する方法を把握する必要があります。

var itemArray = [ 
     {type:"bundle", info: {name: "Product1", price: "1.99"}}, 
     {type:"simple", info: {name: "Product2", price: "2.99"}}, 
     {type:"simple", info: {name: "Product3", price: "3.99"}}]; 
私は bundle製品の種類をフィルタのみ simple製品アレイに沿って通過しているよそこから

、私は次のようであることをやっている:

// Using a for loop 
var filtered = []; 
for (var i = 0; i < itemArray.length; ++i) { 
    var item = itemArray[i]; 
    if (item.type == 'simple') filtered.push(item); 
} 

return {filtered}; //this returns just the 2 simple product type arrays 

だから私の質問は、私はそれらを取るか、どのようにあります3つの文字列は、私が始めたと私のitemArray形式に変換するJavaScriptを使用して?

+0

あなたは '[simple、{product2、2.99}]'を望んでいますか、 '[simple、product2,2.99]'としたいですか? –

+0

@PhillipMartinおそらくうまくいくでしょう。理想的には、それぞれの製品名と価格の下に対応する製品タイプがあります。 – AJ47

+1

なぜ3つの配列ですか?オブジェクトを使用する! '[{type:bundle、name:prod1、price:1.99}、{type:simple、name:prod2、price:2.99}]' – rckrd

答えて

1

あなたが最初にあなたが持っている3つの配列を結合して、item_type='bundle'に一致する配列をフィルタリングするmapfilterの組み合わせを使用することができます。

var item_type = ['bundle', 'simple', 'simple'], 
 
    item_name = ['product1', 'product2', 'product3'], 
 
    item_price = [1.99, 2.99, 3.99], 
 
    res = item_type.map(function(v,i) { 
 
     //combine arrays 
 
     return [v, { [item_name[i]]: item_price[i] }]; 
 
    }).filter(function(o) { 
 
     // only allow items where 'item_type' is not "bundle" 
 
     return o[0] != "bundle"; 
 
    }); 
 

 
    console.log(JSON.stringify(res, 2, null));

+0

変更済み@スライスの代わりにフィルタを使用するユーザーのソリューション –

0

まず、map、次にfilter、次にmapという必要な表現にオブジェクトの配列にそれらをすべて組み合わせます。以下のような何か:

item_type 
    .map((type, index) => ({ 
     type, 
     index, 
     name: item_name[index], 
     price: item_price[index] 
    })) 
    .filter(el => el.type === 'simple') 
    .map(el => [el.type, {name: el.name, price: el.price}]) 
0

あなたは、列をフィルタリングする配列を転置し、望んでいた内側の配列を構築することができます。

var item_type = ['bundle', 'simple', 'simple'], 
 
    item_name = ['product1', 'product2', 'product3'], 
 
    item_price = [1.99, 2.99, 3.99], 
 
    result = [item_type, item_name, item_price] 
 
     .map((a, _, aa) => a.filter((b, i) => aa[0][i] !== 'bundle')) 
 
     .reduce((r, a, i) => (a.forEach((b, j) => (r[j] = r[j] || [], r[j][i] = b)), r), []) 
 
     .map(a => ({ type: a[0], info: { name: a[1], price: a[2] } })); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

はい... JSはArray.prototype.zip()機能が欠落しています。それを考案し、それに応じて解決しよう。

Array.prototype.zip = function(...a){ 
 
    return this.map((e,i) => [e].concat(a.map(sa => sa[i]))); 
 
}; 
 

 
var itemType = ["bundle", "simple", "simple"], 
 
    itemName = ["product1", "product2", "product3"], 
 
    itemPrice = [1.99,2.99,3.99], 
 
    result = itemType.zip(itemName,itemPrice) 
 
         .map(sa => [sa[0],{[sa[1]]:sa[2]}]) 
 
         .filter(t => t[0] === "simple"); 
 
console.log(result);

PS:私はあなたの条件に合わせて、最後.map().filter()機能の場所を入れ替えますが、以前の回答で降伏変更はSOに奨励されていない問題を修正しました。

関連する問題