从数组列表javascript生成对象

时间:2016-05-26 13:58:34

标签: javascript arrays

如何使用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]};
  }
}

5 个答案:

答案 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
  }
})

See fiddle

答案 4 :(得分:0)

使用Object.keysArray.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
            }
        }
    }
}