[英]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" }}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.