JavaScript数组和对象映射

3

我有两个JavaScript变量

1. 一个名为 categories 的数组:

["Casual & Fashion", "Jackets", "PPE & Safety Equipment", "Sports & Leisure", "Workwear", "Accessories"]

一个名为 result 的对象数组:

  [
    {field: "Workwear", cost: 1.3, cost_p2: 0, cost_diff: -1.3, revenue: 2.6},
    {field: "Hide", cost: 2.8, cost_p2: 0, cost_diff: -2.8, revenue: 5.6},
    {field: "Accessories", cost: 0, cost_p2: 3.1, cost_diff: 3.1, revenue: 10},
    {field: "Safety boots", cost: 24.95, cost_p2: 0, cost_diff: -24.95, revenue: 91},
    {field: "Safety Shoes", cost: 13.9, cost_p2: 0, cost_diff: -13.9, revenue: 27.8},
    {field: "Shorts", cost: 7.45, cost_p2: 0, cost_diff: -7.45, revenue: 14.9},
    {field: "Soft Shell", cost: 17.3, cost_p2: 17.3, cost_diff: 0, revenue: 31.92}
  ]

现在,您可以看到,“workwear”和“accessories”都出现在两个数组中,因此根据原始类别,我需要最终的数组如下:
[
    {"Casual & Fashion": 0}, 
    {"Jackets": 0}, 
    {"PPE & Safety Equipment": 0}, 
    {"Sports & Leisure": 0}, 
    {"Workwear": 2.6}, 
    {"Accessories": 10}
  ]

提取匹配的“字段”值和相关的“收入”值。

我可以口头表达逻辑,但是语法让我很吃力。

非常感谢任何帮助。

2个回答

2

是的,这里有两个循环,mapfind

const categories = ["A", "B", "C", "D"];
const result = [{"A" : 3}, {"D" : 7}];

const final = categories.map(category => {
  const resultItem = result.find(item => category in item);
  return resultItem ?? { [category]: 0 };
});

console.log(final);
// [
//  0: { A: 3 },
//  1: { B: 0 },
//  2: { C: 0 },
//  3: { D: 7 }
// ]

在问题文本更改后回答:

const final = categories.map(category => {
  const resultItem = result.find(item => item.field === category);
  return { [category]: resultItem ? resultItem.revenue : 0 };
});

console.log(final);
// [
//  0: {Casual & Fashion: 0},
//  1: {Jackets: 0},
//  2: {PPE & Safety Equipment: 0},
//  3: {Sports & Leisure: 0},
//  4: {Workwear: 2.6},
//  5: {Accessories: 10}
// ]

这段代码也经过测试。


0

我们只是以简单的方式完成了它

     let arr=["Casual & Fashion", "Jackets", "PPE & Safety Equipment", "Sports & Leisure", "Workwear", "Accessories"];
            
            let dataArr=[
                {field: "Workwear", cost: 1.3, cost_p2: 0, cost_diff: -1.3, revenue: 2.6},
                {field: "Hide", cost: 2.8, cost_p2: 0, cost_diff: -2.8, revenue: 5.6},
                {field: "Accessories", cost: 0, cost_p2: 3.1, cost_diff: 3.1, revenue: 10},
                {field: "Safety boots", cost: 24.95, cost_p2: 0, cost_diff: -24.95, revenue: 91},
                {field: "Safety Shoes", cost: 13.9, cost_p2: 0, cost_diff: -13.9, revenue: 27.8},
                {field: "Shorts", cost: 7.45, cost_p2: 0, cost_diff: -7.45, revenue: 14.9},
                {field: "Soft Shell", cost: 17.3, cost_p2: 17.3, cost_diff: 0, revenue: 31.92}
            ];
            
          const resultArr=arr.map((itemName)=>{
            const result=dataArr.find(({field})=>field===itemName)
            return itemName===result?.field ?
            {[itemName]:parseFloat(`${result.revenue}`)}: {[itemName]:0};
         })
    console.log(resultArr);

在这种情况下,“工作服”和“配件”具有不同的收入价值,如果我想获得所有物品的总收入价值(我只是为一些遇到这种情况的人添加了这个答案)。

  let arr=["Casual & Fashion", "Jackets", "PPE & Safety Equipment",         "Sports & Leisure", "Workwear", "Accessories"];

         let dataArr=[
                {field: "Workwear", cost: 1.3, cost_p2: 0, cost_diff: -1.3, revenue: 2.6},
                {field: "Hide", cost: 2.8, cost_p2: 0, cost_diff: -2.8, revenue: 5.6},
                {field: "Accessories", cost: 0, cost_p2: 3.1, cost_diff: 3.1, revenue: 10},
                {field: "Safety boots", cost: 24.95, cost_p2: 0, cost_diff: -24.95, revenue: 91},
                {field: "Safety Shoes", cost: 13.9, cost_p2: 0, cost_diff: -13.9, revenue: 27.8},
                {field: "Shorts", cost: 7.45, cost_p2: 0, cost_diff: -7.45, revenue: 14.9},
                {field: "Soft Shell", cost: 17.3, cost_p2: 17.3, cost_diff: 0, revenue: 31.92} ,
                {field: "Accessories", cost: 0, cost_p2: 3.1, cost_diff: 3.1, revenue: 5},
                {field: "Workwear", cost: 1.3, cost_p2: 0, cost_diff: -1.3, revenue: 3.6},
            ];
       const resultArr=arr.map((itemName)=>{
          const result=dataArr.filter(({field})=>field===itemName);
          if(result?.length > 0){
            return  {[itemName]:result.reduce((acc,c)=>acc+c.revenue,0)}
          }
          return  {[itemName]:0}
    });
    console.log(resultArr)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接