繁体   English   中英

Javascript通过键减少对象

[英]Javascript reduce Objects by keys

是否有任何underscorejs函数(或本机/自定义js函数)可以转换此struct:

(请看一下真实示例@Jsfiddle

//Simple version, check Jsfiddle for the complete one
var object = {
    "users" : [
        {
            name : "name1"
        },
        {
            name : "name2",
        }
    ]
}

到这样的另一个对象:

//Simple version, check Jsfiddle for the complete one
var object2 = {
    users : {
        name : "name1, name2"
    }
}

这使得与您的小提琴相同的对象:

function getType(val){
    if(Object.prototype.toString.call(val) == '[object Array]') return 'array';
    if(val !== null && typeof val === 'object') return 'object';
    return 'other';
}

function deepReduce(object){
    var obj={};
    function travel(object, key, obj){
        if( getType(object) == 'array'){ // if its array, travel
            for(var i=0;i<object.length;i++){
                travel(object[i],key,obj)
            }
        }else if(getType(object)=='object'){ // if its object
            for(var i in object){
                 if(getType(object[i])!='other'){ // if property is object, keep travel
                    if(!obj.hasOwnProperty(i)){
                        obj[i]={};  
                    }
                    travel(object[i],i,obj[i])
                }else{ // else, set property
                    obj[i] =  (obj[i] == undefined ? object[i] : obj[i]+',' + object[i]) ;
                }
            }
        }
    }
    travel(object,null, obj);
    return obj;
}


var reduced=deepReduce(object)
console.log(reduced)

完整的提琴: http : //jsfiddle.net/97g5v5tt/

您可以使用地图功能

object2 = {}
object2.name = object.users.map(function(a){
    return a.name;
}).join(",");

也许使用减少? 它应该在ES5中可用。

var users = [{name: 'Joe'}, {name: 'Anna'}];
var names = users.reduce(function(prev, current) {

    return prev.name + ' ' + current.name;
});
console.log(names); // "Joe Anna"

要在您的提琴上进行这项工作: http : //jsfiddle.net/Lun8kx2k/

您也可以减少其他键,或编写将递归地检查并减少键的函数。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

这是一个可行的解决方案,代码行少了一点:

Object.deepExtend = function xtend(destination, source) {
    for (var property in source) {
        if (source[property] && source[property].constructor && source[property].constructor === Object) {
            destination[property] = destination[property] || {};
            xtend(destination[property], source[property]);
        } else {
            if (!(destination[property] instanceof Array)) {
                destination[property] = destination[property] == null ? source[property] : [destination[property], source[property]].join(",");
            } else {
                destination[property] = destination[property] == null ? source[property] : destination[property].concat(source[property]);
            }
        }
    }
    return destination;
};

Object.deepExtend(object.users[0], object.users[1])

 var object = { "users" : [ { name : "name1", gender : "M", age : "18", rating : {stars : 5, date : "01.01.2014"}, articles : [ { title : "article1", description : "description1" }, { title : "article2", description : "description2" } ] }, { name : "name2", gender : "F", age : "19", rating : {stars : 6, date : "02.01.2014"}, articles : [ { title : "article3", description : "description3" }, { title : "article4", description : "description4" } ] } ] } Object.deepExtend = function xtend(destination, source) { for (var property in source) { if (source[property] && source[property].constructor && source[property].constructor === Object) { destination[property] = destination[property] || {}; xtend(destination[property], source[property]); } else { if (!(destination[property] instanceof Array)) { destination[property] = destination[property] == null ? source[property] : [destination[property], source[property]].join(","); } else { destination[property] = destination[property] == null ? source[property] : destination[property].concat(source[property]); } } } return destination; }; document.body.appendChild(document.createElement('pre')).innerHTML = (JSON.stringify(Object.deepExtend(object.users[0], object.users[1]), undefined,3)); 

这使用lodash(并且仅部分完成)...也许您可以尝试如下操作:

var object2 = { users: {} };

_.each(['name', 'gender', 'age'], function (prop) {
  object2.users[prop] = _.pluck(object.users, prop).join(', ');
});

// returns Object { users: { age: "18, 19", gender: "M, F", name: "name1, name2" }}

DEMO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM