2013-06-26 31 views
1

是否可以将对象的属性访问为像矩阵那样的对象数组?访问类似矩阵的对象的javaScript数组

我的意思是这样的:

JSON生成的对象:

[ 
    { 
     "Nome": "1", 
     "Departamento": "1", 
     "Cargo": "1" 
    }, 
    { 
     "Nome": "5", 
     "Departamento": "5", 
     "Cargo": "5" 
    }, 
    { 
     "Nome": "2", 
     "Departamento": "2", 
     "Cargo": "2" 
    }, 
    { 
     "Nome": "3", 
     "Departamento": "33", 
     "Cargo": "33" 
    }, 
    { 
     "Nome": "4", 
     "Departamento": "4", 
     "Cargo": "4" 
    } 
] 

如何我试图访问对象属性:

object[0][1] = value; 

我已经做:

object[0]["Nome"] = value; 

我查了很多,但是我找不到解决这个问题的办法。

+1

你不能像使用数组索引那样访问一个对象的属性(这就是你所要做的)。如果你需要使用索引来访问这些值,我建议将这些对象转换为数组。 –

+0

我该如何做这个转换?我可以将数组转换为矩阵然后返回到一个对象数组吗? –

+1

@惠灵顿:你需要什么矩阵?属性名称应该发生什么(它们不包含在矩阵中,因此转换回来很复杂)?您希望项目的值为什么顺序,目前对象是无序的? – Bergi

回答

2

编号

对象和数组在JavaScript中是两种非常不同的类型。数组顺序非常重要,但不保留对象键的顺序。请记住,您仍然可以遍历对象的键。

for (var prop in myObj) { 
    console.log("myObj.prop -> ", myObj[prop]); 
} 
2

如前所述,Array S和Object s为不同的。我并没有真正遵循你从一个结构转换到另一个结构的理由,你应该考虑以不同的方式工作,这完全可以从你的问题和评论描述中得到。但是,如果您确实必须进行转换,那么您需要执行某种映射,以确保事物顺序正确。你可以做这样的事情。

的Javascript

function toMapped (array) { 
    var mapping = { 
      "Nome": 0, 
      "Departamento": 1, 
      "Cargo": 2 
     }, 
     mapped = [], 
     length = array.length, 
     i = 0, 
     element, 
     j; 

    while (i < length) { 
     element = []; 

     for (j in mapping) { 
      if (mapping.hasOwnProperty(j) && array[i].hasOwnProperty(j)) { 
       element[mapping[j]] = array[i][j]; 
      } 
     } 

     mapped.push(element); 
     i += 1; 
    } 

    return mapped; 
} 

function fromMapped (array) { 
    var mapping = { 
      0: "Nome", 
      1: "Departamento", 
      2: "Cargo" 
     }, 
     mapped = [], 
     length = array.length, 
     i = 0, 
     object, 
     j; 

    while (i < length) { 
     object = {}; 
     for (j in mapping) { 
      if (mapping.hasOwnProperty(j) && array[i].hasOwnProperty(j)) { 
       object[mapping[j]] = array[i][j]; 
      } 
     } 

     mapped.push(object); 
     i += 1; 
    } 

    return mapped; 
} 

var test = [{ 
    "Nome": "1", 
    "Departamento": "1", 
    "Cargo": "1" 
}, { 
    "Nome": "5", 
    "Departamento": "5", 
    "Cargo": "5" 
}, { 
    "Nome": "2", 
    "Departamento": "2", 
    "Cargo": "2" 
}, { 
    "Nome": "3", 
    "Departamento": "33", 
    "Cargo": "33" 
}, { 
    "Nome": "4", 
    "Departamento": "4", 
    "Cargo": "4" 
}]; 

var mapped = toMapped(test); 
var unmapped = fromMapped(mapped); 

console.log(test); 
console.log(mapped); 
console.log(unmapped); 

jsfiddle

使用ECMA5 Array.prototype.map

的Javascript

function toMapped(array) { 
    var mapping = { 
     "Nome": 0, 
     "Departamento": 1, 
     "Cargo": 2 
    }; 

    return array.map(function (object) { 
     var element = [], 
      i; 

     for (i in mapping) { 
      if (mapping.hasOwnProperty(i) && object.hasOwnProperty(i)) { 
       element[mapping[i]] = object[i]; 
      } 
     } 

     return element; 
    }); 
} 

function fromMapped(array) { 
    var mapping = { 
     0: "Nome", 
     1: "Departamento", 
     2: "Cargo" 
    }; 

    return array.map(function (element) { 
     var object = {}, 
      i; 

     for (i in mapping) { 
      if (mapping.hasOwnProperty(i) && element.hasOwnProperty(i)) { 
       object[mapping[i]] = element[i]; 
      } 
     } 

     return object; 
    }); 
} 

var test = [{ 
    "Nome": "1", 
     "Departamento": "1", 
     "Cargo": "1" 
}, { 
    "Nome": "5", 
     "Departamento": "5", 
     "Cargo": "5" 
}, { 
    "Nome": "2", 
     "Departamento": "2", 
     "Cargo": "2" 
}, { 
    "Nome": "3", 
     "Departamento": "33", 
     "Cargo": "33" 
}, { 
    "Nome": "4", 
     "Departamento": "4", 
     "Cargo": "4" 
}]; 

var mapped = toMapped(test); 
var unmapped = fromMapped(mapped); 

console.log(test); 
console.log(mapped); 
console.log(unmapped); 

jsfiddle

+1

我建议只是遍历''mapping'而不是'object' /'子数组''迭代/枚举。此外,你真的应该使用'map'函数来代替'forEach' ... – Bergi

+0

当然,在很多方面它可以做到,我通常会使用'while',在这些例子中用于跨浏览器兼容性,但是懒惰/短时间使用'forEach'。但确定'map'也适用于ECMA5方法。 – Xotic750

+0

@Bergi更新了你的建议。 – Xotic750