【问题标题】:Parse JSON object for unique records解析 JSON 对象以获取唯一记录
【发布时间】:2017-06-13 06:50:03
【问题描述】:

我有以下 JSON 对象:

var data =JSON.parse('[{"Title":"Test 1","State":"Colorado"}, 
                       {"Title":"Test 1","State":"Arizona"},
                       {"Title":"Test 2","State":"Utah"},
                       {"Title":"Test 2","State":"Arizona"},
                       {"Title":"Test 3","State":"Arizona"}]');

如何解析这个 data 对象,以便得到以下输出:

resultData = [{"Title":"Test 1", State: ["Colorado", "Arizona"]},
              {"Title":"Test 2", State: ["Utah", "Arizona"]},
              {"Title":"Test 3", State: ["Arizona"]}]

到目前为止,我尝试了以下操作:

var resultData = {},
groupBy = "Title";

for (var i = 0; i < data.length; i++) {
    if (!resultData[data[i][groupBy]])
        resultData[data[groupBy]] = [];
    resultData[data[i][groupBy]].push(data[i]);
};

但它没有帮助并返回一些奇怪的对象,如下所示:

resultData = [{Test 1: [{State: "Colorado"}, {State: "Arizona"}]},
              {Test 2: [{State: "Utah"}, {State: "Arizona"}]},
              {Test 3: [{State: "Arizona"}]}]

谁能帮我实现同样的目标。

【问题讨论】:

  • 我认为这应该是状态数组State: ["Colorado", "Arizona"]
  • 感谢您的注释!问题已更新!

标签: javascript json parsing object


【解决方案1】:

你想要达到的目标是 reduce 的完美案例:

第 1 步 - 像以前一样解析数据

var data =JSON.parse('[{"Title":"Test 1","State":"Colorado"}, 
                       {"Title":"Test 1","State":"Arizona"},
                       {"Title":"Test 2","State":"Utah"},
                       {"Title":"Test 2","State":"Arizona"},
                       {"Title":"Test 3","State":"Arizona"}]');

第 2 步 - 将具有相同标题的状态合并到数组中

var titles = data.reduce(function(acc, item){
    var title = item.Title;
    var state = item.State;

    if (!Object.prototype.hasOwnProperty.call(acc, title)){
        acc[title] = [];
    }

    acc[title].push(state);
    return acc;
}, {});

第 3 步 - 使用组合状态构建最终数组

var resultData = Object.keys(titles).map(function(title){
    return {
        Title: title,
        State: titles[title]
    }
});

var data = JSON.parse('[{"Title":"Test 1","State":"Colorado"}, {"Title":"Test 1","State":"Arizona"},{"Title":"Test 2","State":"Utah"},{"Title":"Test 2","State":"Arizona"},{"Title":"Test 3","State":"Arizona"}]');

var titles = data.reduce(function(acc, item) {
  var title = item.Title;
  var state = item.State;

  if (!Object.prototype.hasOwnProperty.call(acc, title)) {
    acc[title] = [];
  }

  acc[title].push(state);
  return acc;
}, {});

var resultData = Object.keys(titles).map(function(title) {
  return {
    Title: title,
    State: titles[title]
  }
});

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

【讨论】:

    【解决方案2】:

    您可以使用单循环方法,对相同组的哈希表进行闭包。

    var data = [{ Title: "Test 1", State: "Colorado" }, { Title: "Test 1", State: "Arizona" }, { Title: "Test 2", State: "Utah" }, { Title: "Test 2", State: "Arizona" }, { Title: "Test 3", State: "Arizona" }],
        key = 'Title',
        grouped = data.reduce(function (group) {
            return function (r, o) {
                if (!group[o[key]]) {
                    group[o[key]] = [];
                    r.push({ Title: o.Title, State: group[o[key]] });
                }
                group[o[key]].push(o.State);
                return r;
            };
        }(Object.create(null)), []);
    
    console.log(grouped);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多