Javascript:如何结合&过滤阵列

时间:2017-04-13 19:50:07

标签: javascript arrays zapier

我有3个字符串,我需要转换成数组,从那里我想过滤,然后使用javascript结合它们,我需要注意我使用Zapier和他们的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个字符串并使用javascript将其转换为itemArray格式?

4 个答案:

答案 0 :(得分:1)

您可以使用mapfilter的组合首先合并您拥有的三个数组,然后过滤掉与item_type='bundle'匹配的数组。

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

是的...... JS缺少Array.prototype.zip()功能。让我们发明并相应地解决。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

PS:我已经交换了最后.map().filter()函数的位置以满足您的要求,但在SO中不鼓励修改先前答案中产生变化的问题。

答案 2 :(得分: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}])

答案 3 :(得分:0)

您可以过滤列,转置数组并构建所需的内部数组。

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;