Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改Javascript对象/数组的格式_Javascript - Fatal编程技术网

更改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只是用
[]
而不是
{}
初始化它。其他一切都是一样的。