Javascript 从对象数组创建字符串

Javascript 从对象数组创建字符串,javascript,Javascript,我有两个数组,如下所示: var product1=[ { “品牌”:“一加一” }, { “品牌”:“一加一” } ]; var product2=[ { “品牌”:“一加一” }, { “品牌”:“苹果” } ]; 我想在数组中循环并打印以下内容: 如果是产品1,则输出您有2个一加 如果是产品2,则输出您有1个One Plus和1个Apple 下面是我尝试的代码 var product1=[ { “品牌”:“一加一” }, { “品牌”:“一加一” } ]; var product2=[

我有两个数组,如下所示:

var product1=[
{
“品牌”:“一加一”
},
{
“品牌”:“一加一”
}
];
var product2=[
{
“品牌”:“一加一”
},
{
“品牌”:“苹果”
}
];
我想在数组中循环并打印以下内容:

  • 如果是产品1,则输出
    您有2个一加
  • 如果是产品2,则输出
    您有1个One Plus和1个Apple
  • 下面是我尝试的代码

    var product1=[
    {
    “品牌”:“一加一”
    },
    {
    “品牌”:“一加一”
    }
    ];
    var product2=[
    {
    “品牌”:“一加一”
    },
    {
    “品牌”:“苹果”
    }
    ];
    计数器1={}
    product1.forEach(功能(obj){
    var key=JSON.stringify(obj)
    计数器1[键]=(计数器1[键]| | 0)+1
    });
    控制台日志(计数器1);
    计数器2={}
    产品2.forEach(功能(obj){
    var key=JSON.stringify(obj)
    计数器2[键]=(计数器2[键]| | 0)+1
    });
    控制台日志(计数器2)这个怎么样

    var product1=[{
    “品牌”:“一加一”
    },
    {
    “品牌”:“一加一”
    }
    ];
    var product2=[{
    “品牌”:“一加一”
    },
    {
    “品牌”:“苹果”
    }
    ];
    功能产品(arr){
    让计数器=arr.reduce((acc,val)=>
    (acc[val.Brand]=(acc[val.Brand]| | 0)+1,acc),{};
    让strings=Object.keys(counter.map)(k=>`${counter[k]}${k}`);
    return`youhave${strings.join('and')}`;
    }
    console.log(countProducts(product1));
    console.log(countProducts(product2))
    
    const product1=[
    {品牌:“一加”},
    {品牌:“一加”},
    ];
    常数产品2=[
    {品牌:“一加”},
    {品牌:“苹果”},
    ];
    函数WhatyYouhaven(列表){
    return`youhave`+Object.entries(list.reduce)((a,c)=>{
    a[c.品牌]=a[c.品牌]| | 0;
    a[c.品牌]++;
    返回a;
    }.map(([brand,count])=>“${count}${brand}`”).join(`and`);
    }
    console.log(whatyouhaven(product1));
    
    console.log(whatyouhaven(product2))您首先必须计算发生的事件, 而不仅仅是字符串concat或模板的问题

    函数strinify(a){
    让发生={};
    a、 forEach(函数(e,i){
    如果(如品牌发生){
    发生[例如品牌]++;
    }否则{
    发生率[e.品牌]=1;
    }
    });
    设str=[];
    用于(正在发生的品牌){
    计数=事件[品牌];
    str.push(计数+“”+品牌);
    }; 
    返回“youhave”+str.join(“and”);
    }
    控制台日志(strinify)([
    {
    “品牌”:“一加一”
    },
    {
    “品牌”:“一加一”
    },
    {
    “品牌”:“苹果”
    }
    ]));
    
    const order1=[
    {
    “品牌”:“一加一”,
    “测试”:“测试”
    },
    {
    “品牌”:“一加一”
    },
    {
    “酒吧”:“富”
    }
    ];
    常量顺序2=[
    {
    “品牌”:“一加一”
    },
    {
    “品牌”:“苹果”
    }
    ];
    常量orderToString=(顺序)=>{
    if(order==null)返回;
    const productsWithBrand=order.filter(product=>Object.keys(product.includes('Brand'));
    const productBrandCounter=(计数器,产品)=>(计数器[产品.品牌]=(计数器[产品.品牌]| 0)+1,计数器);
    const countPerProduct=productsWithBrand.reduce(productBrandCounter,{});
    const stringPerProduct=Object.keys(countPerProduct.map)(brand=>`${countPerProduct[brand]}${brand}`);
    return`youhave${stringPerProduct.join('and')}`;
    }
    
    log(orderToString(order1))
    JSON始终是一个字符串。为什么要将
    JSON.stringify(obj)
    作为键,而不是仅使用
    obj.Brand
    @user4642212回滚该编辑?很明显,
    string
    不是这里的关键词。@Brad我没有回滚编辑,我同时编辑并查看修订历史以重新应用您的更改。这比从头开始要快。我根本不会使用
    JSON
    。只需分组和计数:,然后减少密钥和计数。这与我自己的解决方案完全相同,兄弟。不过实用性要差一点。@gyohza真的!打败我!但是在你的减少中检查你的返回值?你是指这个位
    (acc[val.Brand]| | 0)+1
    ?是的,实际上是完全相同的表达方式实际上,这是一个相当标准的答案,所以难怪两者如此相似。@gyohza我的意思是在逗号后返回acc,这是一个我已经忘记的简洁的JS速记!谢谢
    const product1s = product1.reduce((acc, product) => {
    acc[product.Brand] = (acc[product.Brand] || 0) + 1;
    return acc;
    }, {});
    
    console.log(
    `You have ${
    Object.keys(product1s).map(product => `${product1s[product]} ${product}`).join(" and ")
    }`
    );