如何使用JavaScript数组,例如:
var listArray = [
['a', 'blue', 52],
['a', 'green', 27],
['a', 'yellow', 36],
['b', 'red', 99],
['b', 'blue', 11]
];
并在新的目标中合并副本。为了得到这样的东西:
var newObject = {
'a': {
'name': 'a',
'colors': {
'blue': {
'name': 'blue',
'value': 52
},
'green': {
'name': 'green',
'value': 27
}
}
},
'b': {
'name': 'b',
'colors': {
'red': {
'name': 'red',
'value': 99
},
'blue': {
'name': 'blue',
'value': 11
}
}
}
}
到目前为止,我一直尝试但仍然没有工作:
var newObject = {};
var colors = {}
for (var item in listArray ) {
newObject[listArray[item][0]] = {
'name': myViewData[item][0]
};
newObject[listArray[item][0]].colors = colors[listArray[item][1]] = {'name' : listArray[item][1], 'value' : listArray[item][2]};
}
}
答案 0 :(得分:4)
试试这个:
var newObject = { };
for (var i = 0; i < listArray.length; i += 1) {
var triple = listArray[i];
if (!(triple[0] in newObject)) {
newObject[triple[0]] = {
name: triple[0],
colors: {}
};
}
newObject[triple[0]].colors[triple[1]] = {
name: triple[1],
value: triple[2]
};
}
答案 1 :(得分:1)
使用 reduce()
方法
var listArray = [
['a', 'blue', 52],
['a', 'green', 27],
['a', 'yellow', 36],
['b', 'red', 99],
['b', 'blue', 11]
];
var res = listArray.reduce(function(a, b) {
// check property is defined
if (!a[b[0]])
// define the object with name and colors property
a[b[0]] = { 'name': b[0], 'colors':{} }
// add property in colors sub property
a[b[0]]['colors'][b[1]] = { 'name': b[1], 'value': b[2] }
// return the updated object
return a;
}, {});
console.log(res);
对于较旧的浏览器,请检查polyfill option of reduce method。
答案 2 :(得分:0)
请查看此片段
var listArray = [['a', 'blue', 52], ['a', 'green', 27], ['a', 'yellow', 36], ['b', 'red', 99], ['b', 'blue', 11]];
var newObject = {}
for (var i = 0; i < listArray.length; i++) {
var item = listArray[i],
name = item[0],
color = item[1],
value = item[2],
objectItem = newObject[name]
if (!objectItem) {
objectItem = {
name: name,
colors: {},
}
}
if (!objectItem.colors[color]) {
objectItem.colors[color] = {
name: color,
value: value
}
}
newObject[name] = objectItem
}
console.log(newObject)
答案 3 :(得分:0)
我认为你可能正在寻找这个(使用Array.prototype.forEach()):
var listArray =[
["a", "blue", 52],
["a", "green", 27],
["a", "yellow", 36],
["b", "red", 99],
["b", "blue", 11]
];
var newObject = {};
listArray.forEach(function(el) {
if(!(el[0] in newObject))
newObject[el[0]] = {name: el[0], colors: {}}
if(!(el[1] in newObject[el[0]].colors))
newObject[el[0]].colors[el[1]] = { name: el[1], value: el[2]}
else {
// Do what you want to do if the color is already in there
}
})
答案 4 :(得分:0)
使用Object.keys
和Array.forEach
函数的解决方案:
var newObject = {};
listArray.forEach(function (v) {
var k = v[0], color = v[1], innerObj = {'name': color, 'value': v[2]};
if (!newObject[k]) {
var obj = {'name': k, 'colors': {}};
obj['colors'][color] = innerObj;
newObject[k] = obj;
} else if (Object.keys(newObject[k]['colors']).indexOf(color) === -1) {
newObject[k]['colors'][color] = innerObj;
}
}, newObject);
console.log(JSON.stringify(newObject, 0, 4));
输出:
{
"a": {
"name": "a",
"colors": {
"blue": {
"name": "blue",
"value": 52
},
"green": {
"name": "green",
"value": 27
},
"yellow": {
"name": "yellow",
"value": 36
}
}
},
"b": {
"name": "b",
"colors": {
"red": {
"name": "red",
"value": 99
},
"blue": {
"name": "blue",
"value": 11
}
}
}
}