comment_list.inc': $pre .= $default_pre .= 'comment_list.inc.htm'; break; case 'message': $pre .= $default_pre .= 'message.htm'; break; case 'tag_list': $pre .= $default_pre .= 'tag_list.htm'; break; case 'tag': $pre .= $default_pre .= 'tag.htm'; break; case 'flag': $pre .= $default_pre .= 'flag.htm'; break; case 'my': $pre .= $default_pre .= 'my.htm'; break; case 'my_password': $pre .= $default_pre .= 'my_password.htm'; break; case 'my_bind': $pre .= $default_pre .= 'my_bind.htm'; break; case 'my_avatar': $pre .= $default_pre .= 'my_avatar.htm'; break; case 'home_article': $pre .= $default_pre .= 'home_article.htm'; break; case 'home_comment': $pre .= $default_pre .= 'home_comment.htm'; break; case 'user': $pre .= $default_pre .= 'user.htm'; break; case 'user_login': $pre .= $default_pre .= 'user_login.htm'; break; case 'user_create': $pre .= $default_pre .= 'user_create.htm'; break; case 'user_resetpw': $pre .= $default_pre .= 'user_resetpw.htm'; break; case 'user_resetpw_complete': $pre .= $default_pre .= 'user_resetpw_complete.htm'; break; case 'user_comment': $pre .= $default_pre .= 'user_comment.htm'; break; case 'single_page': $pre .= $default_pre .= 'single_page.htm'; break; case 'search': $pre .= $default_pre .= 'search.htm'; break; case 'operate_sticky': $pre .= $default_pre .= 'operate_sticky.htm'; break; case 'operate_close': $pre .= $default_pre .= 'operate_close.htm'; break; case 'operate_delete': $pre .= $default_pre .= 'operate_delete.htm'; break; case 'operate_move': $pre .= $default_pre .= 'operate_move.htm'; break; case '404': $pre .= $default_pre .= '404.htm'; break; case 'read_404': $pre .= $default_pre .= 'read_404.htm'; break; case 'list_404': $pre .= $default_pre .= 'list_404.htm'; break; default: $pre .= $default_pre .= theme_mode_pre(); break; } if ($config['theme']) { $conffile = APP_PATH . 'view/template/' . $config['theme'] . '/conf.json'; $json = is_file($conffile) ? xn_json_decode(file_get_contents($conffile)) : array(); } !empty($json['installed']) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . ($id ? $id . '_' : '') . $pre; (empty($path_file) || !is_file($path_file)) and $path_file = APP_PATH . 'view/template/' . $config['theme'] . '/htm/' . $pre; if (!empty($config['theme_child']) && is_array($config['theme_child'])) { foreach ($config['theme_child'] as $theme) { if (empty($theme) || is_array($theme)) continue; $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . ($id ? $id . '_' : '') . $pre; !is_file($path_file) and $path_file = APP_PATH . 'view/template/' . $theme . '/htm/' . $pre; } } !is_file($path_file) and $path_file = APP_PATH . ($dir ? 'plugin/' . $dir . '/view/htm/' : 'view/htm/') . $default_pre; return $path_file; } function theme_mode_pre($type = 0) { global $config; $mode = $config['setting']['website_mode']; $pre = ''; if (1 == $mode) { $pre .= 2 == $type ? 'portal_category.htm' : 'portal.htm'; } elseif (2 == $mode) { $pre .= 2 == $type ? 'flat_category.htm' : 'flat.htm'; } else { $pre .= 2 == $type ? 'index_category.htm' : 'index.htm'; } return $pre; } ?>How to map Multiple object data in a Single object using Javascript? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How to map Multiple object data in a Single object using Javascript? - Stack Overflow

programmeradmin0浏览0评论

var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];

var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];

var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];

var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];

var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

I am getting following data from multiple source. In those object there is a field PID which one is mon. So , I want to bined it according to PID.

Expected output :

var p = [{
  "pid": 1,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
},{
  "pid": 2,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
}]

I tried with following

 var result = sourceA.map((obj, index) => Object.assign({}, sourceA[index], sourceB[index], sourceC[index]));

But I am not getting what I expected. then I tried with How to group array of objects by key But My source is 3 not 1.

Share Improve this question edited Sep 28, 2017 at 11:50 pskkar 4421 gold badge4 silver badges18 bronze badges asked Sep 28, 2017 at 10:35 ParkarParkar 3,0463 gold badges17 silver badges24 bronze badges 5
  • Possible duplicate of How to group array of objects by key – Rajesh Commented Sep 28, 2017 at 10:38
  • var result = sourceA.map((obj, index) => Object.assign({}, sourceA[index], sourceB[index], sourceC[index])); – Parkar Commented Sep 28, 2017 at 10:39
  • When someone requests for more information, please add this information in question. Comments can get collapsed. – Rajesh Commented Sep 28, 2017 at 10:40
  • @Sharat did any of the solutions solve your issue? – Brett DeWoody Commented Sep 29, 2017 at 12:37
  • Just fixed it. Thanks everyone. – Parkar Commented Sep 29, 2017 at 12:43
Add a ment  | 

4 Answers 4

Reset to default 3
var p = [{
  "pid": 1,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
},{
  "pid": 2,
  "array": [{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30},{"data_a": 33,"data_x": 30}]
}]

As it is not clear from your question were from we could get "33" and "30" values i assume you made a typo, and expected result should be like this:

var p = [{
  "pid": 1,
  "array": [{"data_a": 23,"data_x": 23},{"data_a": 34,"data_x": 34},{"data_a": 35,"data_x": 34}]
},{
  "pid": 2,
  "array": [{"data_a": 23,"data_x": 23},{"data_a": 34,"data_x": 34},{"data_a": 35,"data_x": 34}]
}]

considering the above you may try to use few loops to group data by pid and then format it as expected

var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];
var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];
var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

function bineInputs(...inputs) {

  var bined = {};
  for (var i = 0; i< inputs.length; i++) {
    for (var j = 0; j < inputs[i].length; j++) {
      var record = inputs[i][j];

      if (!bined[record.pid]) {
        bined[record.pid] = []
      }
      var tmp = Object.assign({}, record);
      delete tmp.pid;
      bined[record.pid].push(tmp);
    }
  }

  var result = [];
  for (var key in bined) {
    if (bined.hasOwnProperty(key)) {
      result.push({
        pid: key,
        array: bined[key]
      });
    }
  }

  return result;
}

var expected = bineInputs(sourceA, sourceB, sourceC);
console.log(expected);

Result should look like expected. Probably this is not the best solution, but it works

If the data is always structured as an object like:

{
  pid,
  data_a,
  data_b,
  ...
  data_x
}

we can do the following:

var sourceA = [{pid: 1, data_a: 23, data_x: 23}, {pid: 2, data_a: 23, data_x: 23}];
var sourceB = [{pid: 1, data_a: 34, data_x: 34}, {pid: 2, data_a: 34, data_x: 34}];
var sourceC = [{pid: 1, data_a: 35, data_x: 34}, {pid: 2, data_a: 35, data_x: 34}];

var bineSources = function(sources) {
  var bined = sources.reduce((result, source) => {

    source.forEach(el => {
      var pid = el.pid;
      delete el.pid;

      result[pid] = result[pid] || {pid: pid, array: []}

      result[pid].array.push(el);
    });

    return result;
  }, []);

  return bined.filter(Boolean);
};

console.log(bineSources([sourceA, sourceB, sourceC]));

One advantage to this method is it works for any number of pid and data_N properties.

The result is:

[
  {
    "pid": 1,
    "array": [{"data_a": 23, "data_x": 23}, {"data_a": 34, "data_x": 34}, {"data_a": 35, "data_x": 34}]
  },
  {
    "pid": 2,
    "array": [{"data_a": 23,"data_x": 23}, {"data_a": 34, "data_x": 34}, {"data_a": 35, "data_x": 34}]
  }
]

I used a Map as temporary structure:

var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];

var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];

var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

const myMap = new Map();

function analyzeSource(source) {
    for(obj of source) {
        if(myMap.has(obj.pid)) {
            var tmpArr = myMap.get(obj.pid);
            tmpArr.push({data_a: obj.data_a, data_x: obj.data_x});
            myMap.set(obj.pid, tmpArr);
        }
        else {
            var newArr = new Array();
            newArr.push({data_a: obj.data_a, data_x: obj.data_x});
            myMap.set(obj.pid, newArr);
        }
    }
}

analyzeSource(sourceA);
analyzeSource(sourceB);
analyzeSource(sourceC);

function fromMyMapToArr() {
    var outArr = new Array();
    for (var entry of myMap) {
        outArr.push({pid: entry[0], array: entry[1]});
    }

    return outArr;
}

var outArr = fromMyMapToArr();
console.log(outArr);

Try this:

    var sourceA = [{ pid: 1, data_a: 23, data_x: 23},{ pid: 2, data_a: 23 ,data_x: 23}];
    var sourceB = [{ pid: 1, data_a: 34, data_x: 34 },{ pid: 2, data_a: 34, data_x: 34 }];
    var sourceC = [{ pid: 1, data_a: 35, data_x: 34 },{ pid: 2, data_a: 35, data_x: 34 }];

    var mergedArrays = sourceA.concat(sourceB).concat(sourceC);

    Array.prototype.groupBy = function(prop) {
        return this.reduce(function(groups, item) {
            var val = item[prop];
            groups[val] = groups[val] || [];
            groups[val].push(item);
            return groups;
        }, {});
    }

    var groupByResult = mergedArrays.groupBy('pid'); 
    var result = [];
    for(pid in groupByResult){
        var obj = {};
        obj.pid = pid;
        obj.array = groupByResult[pid].map(function(obj){ delete obj.pid; return obj});
        result.push(obj);
    }
    console.log(JSON.stringify(result));
发布评论

评论列表(0)

  1. 暂无评论