【问题标题】:how to reindex object start from 0如何重新索引对象从0开始
【发布时间】:2015-01-01 16:16:26
【问题描述】:

我从下面的代码中有一个对象输出如何在js中设置索引从0开始?

Object
  3: Object
     id: 34
     type: 0


var obj = {};
var edited = false;
for (var i = 0; i < $(".list").length; i++) {
  var data_id = parseInt($(".list").eq(i).attr('data-id'));
  var data_type = parseInt($(".list").eq(i).attr('data-type'));
  if ((data_type != 0)) {
    edited = true;
  } else {
    edited = false;
  }

  if (edited == true) {
    obj[i] = {};
    obj[i]['id'] = data_id;
    obj[i]['type'] = data_type;
  }
}

console.log(obj);

【问题讨论】:

  • 你确定你不想要一个数组代替...?
  • 感谢您的回复,我在其他帖子中看到了相同的建议,但我不明白为什么?
  • @AmitJoki 你能解释的更清楚吗?
  • 因为如果你使用数组,索引会自动从零开始,你的问题就会得到解决。
  • 请注意,您基本上是在艰难地做所有事情。使用for 循环迭代jQuery 集合,多次获取相同的集合并使用eq 而不是使用内置的jQuery 方法之一进行迭代和this。使用attr 获取数据属性,因为使用data 会自动强制类型,而您不需要parseInt,根本不需要它,因为您正在进行非严格测试,然后使用一个变量来设置true/false,然后在下一行使用该变量来设置另一个条件等。

标签: javascript jquery data-structures


【解决方案1】:

需要更多 jQuery 吗?

var arr = $(".list").filter(function() {
              return $(this).data('type') != 0;
          }).map(function() {
              return { id : $(this).data('id'), type : $(this).data('type') };
          }).get();

FIDDLE

【讨论】:

  • 这里的get() 是什么?
  • @elaijuh - 它将 jQuery 集合转换为普通数组
  • 这很优雅,但需要考虑浏览器兼容性,特别是对于亲爱的 IE8 或更低版本,使用 filtermap
  • @elaijuh - 在这种情况下,这些是 jQuery 方法,而不是本机方法,所以这不是问题
【解决方案2】:

其实如果你想从 0 开始,使用另一个变量而不是“i”(当你使用它作为索引时我认为是 3)。

var obj = {};
var edited = false;
var obj_idx = 0;
for (var i = 0; i < $(".list").length; i++) {
  var data_id = parseInt($(".list").eq(i).attr('data-id'));
  var data_type = parseInt($(".list").eq(i).attr('data-type'));
  if ((data_type != 0)) {
    edited = true;
  } else {
    edited = false;
  }

  if (edited == true) {
    obj[obj_idx] = {};
    obj[obj_idx]['id'] = data_id;
    obj[obj_idx]['type'] = data_type;
    obj_idx += 1;
  }
}

console.log(obj);

我认为这次 obj 会是这样的:

Object
  0: Object
     id: 34
     type: 0

【讨论】:

    【解决方案3】:

    你可以通过Array.prototype.push.call将对象伪装成数组,这样你也可以获得副作用:obj.length。它有点忍者和优雅:]

    var obj = {};
    var edited = false;
    for (var i = 0; i < $(".list").length; i++) {
      var data_id = parseInt($(".list").eq(i).attr('data-id'));
      var data_type = parseInt($(".list").eq(i).attr('data-type'));
      if ((data_type != 0)) {
        edited = true;
      } else {
        edited = false;
      }
    
      if (edited == true) {
        Array.prototype.push.call(obj, {id: data_id, type: data_type});
      }
    }
    

    【讨论】:

      【解决方案4】:

      我将给出一个非常简单易读的例子。假设您有一个具有以下结构的对象:

      Object
        0: Object
           key: 'some-key'
           value: 'some-value'
        1: Object
           ...
      

      然后您可能想从中删除一个条目并重新索引整个内容,这就是我的做法:

      // obj is Object from above
      const reIndexed = Object.entries(obj).map((element, index) => {
        if (parseInt(element[0] != index) {
          element[0] = index.toString();
        }
        return element;
      }); 
      

      【讨论】:

        猜你喜欢
        • 2010-11-15
        • 2013-05-29
        • 1970-01-01
        • 2010-10-10
        • 2017-12-10
        • 1970-01-01
        • 2018-04-04
        • 1970-01-01
        相关资源
        最近更新 更多