2015-05-20 33 views
2

这是我的代码..变化JSON结构使用JavaScript

var result = data.map(function(item){ 
    return { 
     category:item.category, 
     key:item.key, 
     value:item.value 
    } 
}); 
console.log(result); 

这就是在控制台越来越打印出来..

Array[4] 
0: Object 
category: "common" 
key: "Food" 
value: "food" 

1: Object 
category: "welcome" 
key: "title" 
value: "Welcome..." 

2: Object 
category: "welcome" 
key: "app_description" 
value: "In this App " 

3: Object 
category: "welcome" 
key: "select_location" 
value: "Select Location" 

这就是我想要达到

{ 
    common:{ 
     "Food" : "food" 
    }, 
    welcome:{ 
     title : Welcome..., 
     app_description : "In this App", 
     select_location : "Select Location" 

    } 
} 

这是我正在尝试的代码,但它不工作..

return { 
    item.category:{ 
     item.key:item.value;      
    } 

任何人都可以帮助我吗?我不想使用GSON或任何其他第三方的JS ..我如何才能完成使用只有核心JS?

+0

你可以提供的价值'data'你开始操纵它之前?如你的'.map()'函数中引用的那样? –

+0

你确定,你想使用map()来完成这个任务吗? –

回答

3

首先,你想要的结果是一个对象,而不是一个数组。所以你不能使用.map(),它只将一个数组映射到另一个数组。

你想要.reduce()

var result = data.reduce(function (result, item) { 
    // Create the object the first time it arrives 
    result[item.category] = result[item.category] || {}; 
    // Add the field 
    result[item.category][item.key]=item.value; 
    // Return the resulting object 
    return result; 
}, {}); 
console.log(result);

.reduce()的减少函数需要两个参数(还有两个可选参数)。 累计结果当前项目。返回的值是当前项目在其上处理后的结果。

.reduce()第二个参数(第一个是减函数),是初始值,此值将获得通过作为result对于第一次迭代。

+0

你指定错误的对象,似乎它会像'result [item.category] ​​[item.key] = item.value'还有'result [item.category] ​​= {}'如果它不存在 – Grundy

+1

@Grundy你是正确。我修复并添加了评论。 –

+0

谢谢Madara Uchiha .. :) –

2

Array.prototype.reduce()来救援。

var result = data.reduce(function (previousValue, currentValue) { 
    previousValue[currentValue.category] = previousValue[currentValue.category] || {}; 
    previousValue[currentValue.category][currentValue.key] = currentValue.value; 
    return previousValue; 
}, {}); 
1

你也可以尝试:

var data = [ 
    { 
     category: "common", 
     key: "Food", 
     value: "food" 
    }, 
    { 
     category: "welcome", 
     key: "title", 
     value: "Welcome..." 
    }, 
    { 
     category: "welcome", 
     key: "app_description", 
     value: "In this App " 
    }, 
    { 
     category: "welcome", 
     key: "select_location", 
     value: "Select Location" 
    } 
]; 
var obj = {}; 
for (var i in data) { 
    if(!obj[data[i].category]){ 
     obj[data[i].category] = {}; 
    } 
    obj[data[i].category][data[i].key] = data[i].value; 
} 
console.log(obj);