javascript - 值未输入 Angular 中的键值对

标签 javascript angular ecmascript-6

我有一个 json 文件:

var records= 
[
    {
        "category" : "chinese",
        "name": "noodles"
    },
    {
        "category" : "chinese",
        "name": "veg"  
    },
    {
        "category" : "Indian",
        "name": "Dal"  
    },
    {
        "category" : "Indian",
        "name": "Rajma"  
    },
    {
        "category" : "chinese",
        "name": "chicken"  
    },
    {
        "category" : "continental",
        "name": "fish"
    },
    {
        "category" : "continental",
        "name": "Veg"
    },
    {
        "category" : "Indian",
        "name": "Paratha" 
    }
]

我正在尝试将此 JSON 转换为以下格式:

var newcat = 
{
   "chinese": [
               { "name": "noodles", "category": "chinese" },
               {"name": "veg", "category": "chinese"}, 
               {"name":"chicken", "category": "chinese"}
            ], 
   "indian":  [
               { "name": "Dal", "category": "indian" },
               {"name": "rajma", "category": "indian"}, 
               {"name":"chicken", "category": "indian" }
            ], 
  "continental": [
                 { "name": "fish", "category": "continental" },
                 { "name": "veg", "category": "continental"} 

            ] 
}

我在 Angular 中使用的代码是:

var newcat={}
            var arr= {}
            var isPresent= false;
            var cat
            for (let i=0;i< records.length;i++) {
                cat= records[i].category
                for(let item in newcat) {
                    if(cat == item) {
                        isPresent= true
                    }
                    else {
                            isPresent= false
                    }
                }
                if(isPresent== false){
                    newcat[cat]= []
                }
                else {
                    newcat[cat].push(records[i])
                    console.log("===>",newcat)
                }

            }

我能够构建该对象,但每个类别的所有项目都不会进入新对象newcat

console.log 上的结果应如下所示:

{chinese: Array(3), indian: Array(3), continental: Array(2)}

相反,它会像这样:

{chinese: Array(0), indian: Array(1), continental: Array(1)}

我不明白为什么所有元素都没有进入

最佳答案

如果您已经在使用 Lodash,请使用 _.groupBy 。否则,您可以编写自己的 groupBy 函数:

var records = [
    {
        "category" : "chinese",
        "name": "noodles"
    },
    {
        "category" : "chinese",
        "name": "veg"  
    },
    {
        "category" : "Indian",
        "name": "Dal"  
    },
    {
        "category" : "Indian",
        "name": "Rajma"  
    },
    {
        "category" : "chinese",
        "name": "chicken"  
    },
    {
        "category" : "continental",
        "name": "fish"
    },
    {
        "category" : "continental",
        "name": "Veg"
    },
    {
        "category" : "Indian",
        "name": "Paratha" 
    }
];

function groupBy(array, key) {
  return array.reduce((groups, value) => {
    const group = groups[value[key]] || (groups[value[key]] = []);
    group.push(value);
    return groups;
  }, {});
}

console.log(groupBy(records, 'category'));

或者,使用 for 循环代替 reduce:

function groupBy(array, key) {
  const groups = {};
  for(let i = 0; i < array.length; i++) {
    const value = array[i];
    const valueKey = value[key];
    if(!groups[valueKey]) groups[valueKey] = [];
    groups[valueKey].push(value);
  }
  return groups;
}

编辑:修复现有代码:

您的实现有两个问题。首先,设置 isPresentfor/in 循环在找到匹配项后不会break。其次,最后的 else 语句会导致类别中的第一项不会被推送,因为您所做的只是创建空类别数组。这是修复后的内容:

var records = [
    {
        "category" : "chinese",
        "name": "noodles"
    },
    {
        "category" : "chinese",
        "name": "veg"  
    },
    {
        "category" : "Indian",
        "name": "Dal"  
    },
    {
        "category" : "Indian",
        "name": "Rajma"  
    },
    {
        "category" : "chinese",
        "name": "chicken"  
    },
    {
        "category" : "continental",
        "name": "fish"
    },
    {
        "category" : "continental",
        "name": "Veg"
    },
    {
        "category" : "Indian",
        "name": "Paratha" 
    }
];


var newcat = {};
var arr = {};
var isPresent = false;
var cat;

for (let i=0; i < records.length; i++) {
    cat= records[i].category
    for(let item in newcat) {
        if(cat == item) {
            isPresent= true
            break;
        }
        else {
            isPresent= false
        }
    }
    if(isPresent== false){
        newcat[cat] = []
    }
    newcat[cat].push(records[i])
}

console.log(newcat);

关于javascript - 值未输入 Angular 中的键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50535469/

相关文章:

javascript - JQuery 计数器中的文本

javascript - 当我使用另一个 iframe 时,如何从主页向 iframe 发送数据?

javascript - JQuery 切换下一类

javascript - 一行箭头函数,返回多个

javascript - Electron 打包后不支持 ES6

javascript - 未调用 AngularJS 服务

javascript - Angular 4.3 拦截器不工作

angular - 如何使用jspdf和html2canvas全屏打印

android - Ionic Live Reload Capacitor Gradle 构建 - 失败!找不到 Java 运行时

javascript - 无法在 IIEF 中传递变量