【问题标题】:How to get first and last properties in an object?如何获取对象中的第一个和最后一个属性?
【发布时间】:2017-11-02 19:30:27
【问题描述】:

我正在使用类似于以下的对象(虽然这个对象有 4 个键/值对,但我的实际对象可以有任意数量):

var myObj = {
  action: 'open',
  card: 'Comment card name',
  id: '54AEF364',
  url: 'www.myurl.com'
};

我正在尝试将键和值添加到单个字符串中,以“:”和“|”分隔,如下所示:

var myString = 'action:open|card:Comment card name|id:54AEF364|url:www.myurl.com'

我正在尝试使用 for...in 循环来做到这一点:

for (var i in myObj) {
  var myString += i + ':' + myObj[i] + '|';
}

我能够得到我需要的大部分东西,但有两个例外:

  1. 'undefined' 出现在第一个属性名称之前
  2. 对于最后一个键/值对,不应有“|”在最终值之后,因为这是字符串的结尾

我怎样才能做到这一点?

【问题讨论】:

  • 订单重要吗?
  • 从 myString 中删除最后一个字符。 Have a look here
  • 如果顺序很重要,请注意属性键顺序在技术上未指定(即不保证按任何顺序)。然而,除了解析为数字的键之外,大多数浏览器都会保留键顺序。
  • @JochenBedersdorfer 同意该评论,OP 应阅读此答案:Does JavaScript Guarantee Object Property Order?。这个问题从根本上是有缺陷的。没有“第一个”或“最后一个”属性这样的东西。

标签: javascript object


【解决方案1】:

使用映射和数组连接:

const myObj = {
  action: 'open',
  card: 'Comment card name',
  id: '54AEF364',
  url: 'www.myurl.com'
};

const myObjSerialized = Object.keys(myObj).map(key => `${key}:${myObj[key]}`).join('|');
console.log(myObjSerialized);

【讨论】:

  • 我正在尝试更多地了解地图。如果 myObj[key] 如果为 null 或 undefined,你不会遇到错误吗?
  • 嗨,Ammar map 只是遍历一个数组,该对象总是有键,如果某个键有一个空值,那么我输入的代码只会转换为字符串(因为 javascript 模板)。如果我们需要知道值是 null 还是 undefined,那么我们可以先过滤,然后使用 map。
  • 我刚刚测试过,你是对的。我认为这是@asw1984 应该考虑的情况。谢谢。
【解决方案2】:

您始终可以使用可靠的标准 for 循环并迭代对象的键。

var myObj = {
  action: 'open',
  card: 'Comment card name',
  id: '54AEF364',
  url: 'www.myurl.com'
};

var serialize = function(data){
  var keys = Object.keys(data), string = "";
  for(var k=0; k<keys.length; ++k){
    if(k > 0) string += '|';
    string += keys[k]+':'+data[keys[k]];
  }
  return string;
}

console.log(serialize(myObj));

【讨论】:

    【解决方案3】:

    未定义与变量myString 相关。您必须在 for 循环中使用变量之前声明它:

    var myObj = {
      action: 'open',
      card: 'Comment card name',
      id: '54AEF364',
      url: 'www.myurl.com'
    };
    var myString = "";
    for (var i in myObj) {
      myString += i + ':' + myObj[i] + '|';
    }
    console.log(myString);

    然后你可以删除最后一个“|”像这样:

    if (myString.length > 0) {
      myString = myString.substring(0, myString.length - 1);
    }
    

    不过还有一种更优雅的方式。将字符串替换为数组并在循环末尾加入项目:

    var myArray = [];
    for (var i in myObj) {
      myArray.push(i + ':' + myObj[i]);
    }
    var myString = myArray.join("|");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 2020-07-12
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多