javascript - 在键值对的唯一组合上合并对象

标签 javascript arrays json data-structures underscore.js

我想要一个函数

combineListOnKeys(listOfObjs, listOfKeys) 

这将需要:

var listOfObjs = 
[
  { name: john, state: ny, age: 12}
, { name: john, state: ny, age: 22}
, { name: john, state: dc, age: 32}
, { name: john, state: dc, age: 42}
, { name: paul, state: ca, age: 52}
]

var listOfKeys = ["name", "state"]

并返回:

combineListOnKeys(listOfObjs, listOfKeys)
[ 
 { "name": john, "state": ny, "age": [12, 22]}
,{ "name": john, "state": dc, "age": [32, 42]}
,{ "name": paul, "state": ca, "age": [52]} 
]

我基本上是在寻找匹配所有这些对象共享的多个指定键,并获取剩余的未指定键并将它们组合到一个列表中,从而删除一些重复信息。

我正在使用 underscore.js,但我无法在文档中找到此问题的示例。提前致谢!

最佳答案

很抱歉,这不符合您修改后的功能要求,但我在您修改之前就开始了,并且付出了很多努力,我希望这足以让您组合出自己的功能。连续使用下划线的 _.reduce 和 _.each 方法(并且 _.each 可能会被第二个 _.reduce 或 _.map 替换——像往常一样,有不止一种方法可以做到这一点)。

var arr = [
  { name: 'john', state: 'ny', age: 12}
, { name: 'john', state: 'ny', age: 22}
, { name: 'john', state: 'dc', age: 32}
, { name: 'john', state: 'dc', age: 42}
, { name: 'paul', state: 'ca', age: 52}
];

var resultsMap = _.reduce(arr, function(memo, arrEl) {
    /*
     * var key = JSON.stringify(_.omit(arrEl, 'age'));
     *
     * From original answer but naively fails to account for Javascript objects not returning in order.
     * See "IIFE" below and http://stackoverflow.com/a/28989092/34806
     */ 
    var key = (function() {
        var ageOmittedObj = _.omit(arrEl, 'age');
        var ageOmittedPairs = _.pairs(ageOmittedObj);

        var sortedPairs = _.reduce(_.keys(ageOmittedObj).sort(), function(sortedPairs, key) {
            var pair = _.find(ageOmittedPairs, function(kvPair) {return kvPair[0] == key});
            sortedPairs.push(pair);
            return sortedPairs;
        }, []);

        return JSON.stringify(sortedPairs)
    }) ();

    memo[key] = memo[key] || {};
    memo[key].ages = memo[key].ages || [];
    memo[key].ages.push(arrEl.age);

    return memo;
}, {});


var resultsArr = [];

_.each(resultsMap, function(v, k) {
    var resultObj = {};
    var nameStatePairs = JSON.parse(k);
    var nameStateObj = _.object(_.map(nameStatePairs, function(pair){return [pair[0], pair[1]]}));
    // compare above to http://stackoverflow.com/a/17802471/34806

    resultObj.name = nameStateObj.name;
    resultObj.state = nameStateObj.state;
    resultObj.age = v.ages;
    resultsArr.push(resultObj);
});

console.log(JSON.stringify(resultsArr));
// [{"name":"john","state":"ny","age":[12,22]},{"name":"john","state":"dc","age":[32,42]},{"name":"paul","state":"ca","age":[52]}]

关于javascript - 在键值对的唯一组合上合并对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28973094/

相关文章:

arrays - 如果Excel中的单元格包含数组公式(例如 `={1,2,3}` ),我可以使用VBA提取数组的元素吗

javascript - 如何将文件传递给 PHP 并在一个脚本中将其下载回来?

JavaScript API 可以处理存储在 OneDrive 上的 Excel 文件吗?

javascript - 使用递归查找数组中的元素 - javascript

ios - 过滤今天、昨天的 NSDate 数组以进行绘图

javascript - javascript中解析特定格式的Json数组对象

javascript - 使用 Three.CubeCamera 进行折射

javascript - 映射两个对象数组,匹配属性并将特定信息存储在新数组中

json - 在快速映射时为变量编写 setter 和 getter 方法?

javascript - 使用 JavaScript 在服务器上保存文件