更改Javascript对象/数组的格式
我将用一个简单的例子来说明我想要做什么。假设我有一个变量更改Javascript对象/数组的格式,javascript,Javascript,我将用一个简单的例子来说明我想要做什么。假设我有一个变量rows,内容如下: [ { id: 1, admin_id: 2, start_date: Mon Nov 18 2013 07:19:46 GMT-0800 (PST), status: 1, username: 'Marko Markovic' }, { id: 7, admin_id: 3, start_date: Mon Nov 18 2013 07:20:32 GMT-0800
rows
,内容如下:
[ { id: 1,
admin_id: 2,
start_date: Mon Nov 18 2013 07:19:46 GMT-0800 (PST),
status: 1,
username: 'Marko Markovic' },
{ id: 7,
admin_id: 3,
start_date: Mon Nov 18 2013 07:20:32 GMT-0800 (PST),
status: 0,
username: 'Dzoni Noksvil' } ]
现在,我想创建以下内容:
var gl = {
1: { admin: "Marko Markovic" , status: "1" },
7: { admin: "Dzoni Noksvil" , status: "0" }
};
因此,我需要遍历行
,并根据我认为从上面的示例中可以清楚看到的规则,为每一行向gl
对象添加一行
所以我试过这个
var gl;
rows.forEach(function(row) {
gl[row.id] = { admin: row.username, status: row.status };
});
上面的代码抛出一个错误,说明无法设置未定义的属性“1”
。我也尝试了以下方法,知道它不起作用,但好奇它会抛出什么错误:
var gl;
rows.forEach(function(row) {
gl.row.id = { admin: row.username, status: row.status };
});
错误是无法读取未定义的属性“行”
有人能告诉我如何正确地执行此操作吗?如果可能,还可以告诉我错误的含义,因为我不知道这里应该是未定义的
哦,请只使用纯Javascript,即使jQuery有一个更简单/更好的解决方案。您忘记初始化“gl”
此外,您还可以使用.reduce
:
var gl = rows.reduce(function(gl, row) {
gl[row.id] = { admin: row.username, status: row.status };
return gl;
}, {});
我不知道你的“id”值可能是什么样子,但如果你总是使用数字键,在我看来,你最好把“gl”设为一个数组,而不仅仅是一个普通对象。这样,您就可以在其上使用.forEach
等
请注意,本机迭代器函数跳过它们操作的数组中的“洞”。这意味着,在本例中,如果以“gl”作为数组开始,则位置0、2、3、4、5和6将以孔结束,因为只设置了1和7。数组的长度为8,但对.forEach()
或.map()
或其他任何对象的调用只会执行两次回调调用。这与jQuery的$不同。each()
默认情况下,将使用未定义的初始化gl
。如果您试图构建一个对象,您必须用一个对象初始化它,如下所示
var gl = {};
var data = [ { id: 1,
admin_id: 2,
start_date: "Mon Nov 18 2013 07:19:46 GMT-0800 (PST)",
status: 1,
username: 'Marko Markovic' },
{ id: 7,
admin_id: 3,
start_date: "Mon Nov 18 2013 07:20:32 GMT-0800 (PST)",
status: 0,
username: 'Dzoni Noksvil' } ];
var result = data.reduce(function(result, currentObject) {
result[currentObject.id] = {
admin: currentObject.username,
status: currentObject.status
};
return result;
}, {});
console.log(result);
或者你可以用函数来做,就像这样
var gl = {};
var data = [ { id: 1,
admin_id: 2,
start_date: "Mon Nov 18 2013 07:19:46 GMT-0800 (PST)",
status: 1,
username: 'Marko Markovic' },
{ id: 7,
admin_id: 3,
start_date: "Mon Nov 18 2013 07:20:32 GMT-0800 (PST)",
status: 0,
username: 'Dzoni Noksvil' } ];
var result = data.reduce(function(result, currentObject) {
result[currentObject.id] = {
admin: currentObject.username,
status: currentObject.status
};
return result;
}, {});
console.log(result);
输出
{ '1': { admin: 'Marko Markovic', status: 1 },
'7': { admin: 'Dzoni Noksvil', status: 0 } }
-它既有您的固定版本,也有我的建议版本。您忘记初始化gl
,因此当您尝试设置属性时,它的值为未定义
var gl = {};
…
如果您需要支持不支持本机Array.prototype.reduce
的旧浏览器,则可以使用常规for循环和新数组:
var gl = function () {
var myArray = [];
for (var i = 0; i < rows.length; i++) {
var self = rows[i];
var obj = {};
obj[self.id] = {
admin: self.username,
status: self.status
}
myArray.push(obj);
}
return myArray;
};
// output
console.log(gl());
var gl=函数(){
var myArray=[];
对于(变量i=0;i
您真的希望“gl”是普通对象而不是数组吗?无论如何,您都在使用数字键。谢谢,但是在按照您所说的正确初始化gl
之后,即使没有错误,执行console.log(gl)
之后只需记录{}
。我的代码还有什么问题吗?@jovan如果你复制了.reduce()
代码,它会将结果放在一个名为“result”的变量中。不,我是指问题中我自己的代码(第一个版本)。@jovan你能创建JSFIDLE吗?这样就很容易调试了?@jovan请检查这个。它既有您的固定版本,也有我建议的版本。如果我将其作为一个数组来执行,是否可以使用gl[row.id]['admin']=row.username;总账[行id]['status']=行状态
etc?@jovan只是用[]
而不是{}
初始化它。其他一切都是一样的。