【问题标题】:Change position of object properties by matching other array通过匹配其他数组来改变对象属性的位置
【发布时间】:2017-10-28 10:31:29
【问题描述】:

我有一个对象

var $data = {
  D_1_AA_Changes.xml: "This is a string", 
  D_2_Compare_AA_Changes.xml: "This is a string"
}

我需要将属性与我拥有的另一个数组匹配:

var list_match = ["D_2_Compare_AA_Changes","D_1_AA_Changes"]; 

我需要将list_match$data 属性匹配,并将$data 对象排列为list_match 数组值。

所以匹配后我必须像这样安排$data

$data = {
  D_2_Compare_AA_Changes.xml: "This is a string",
  D_1_AA_Changes.xml: "This is a string"
}

所以我需要像上面这样的最终结果

【问题讨论】:

  • 为什么不使用数组来访问数组的顺序呢?
  • 最后我需要匹配订单后的对象...你能给我提供任何例子吗
  • javascript 对象中没有“顺序”概念。您不知道属性是如何在内部进行管理的,并且不能依赖您在插入对象时给它们的“位置”。
  • 这个数据对象是一个从某个xml文件创建的动态对象亲爱的,所以我没有访问那个文件...我只是得到这个数据对象,需要按照我上面提供的顺序排列

标签: javascript jquery


【解决方案1】:

在完全兼容的 ES2015+ JavaScript 引擎中可以做到这一点,但一般来说,最好将对象属性视为无序的,因为许多对象属性操作(如 for-in),即使在 ES2015+ 中,也不是保证遵循新用户使用的顺序(如Object.getOwnPropertyNamesJSON.stringify)。序列化和反序列化(例如,往返 JSON)时,也不一定要维护顺序。它可能是,但不能保证是。*依赖无保证的行为会导致微妙的、浪费时间的错误。

但是,如果您想在 ES2015+ 引擎上执行此操作,请创建一个新对象并按照您希望它们的顺序添加这些属性:

const $data = {
  "D_1_AA_Changes.xml": "This is a string",
  "D_2_Compare_AA_Changes.xml": "This is a string"
};

var list_match = ["D_2_Compare_AA_Changes","D_1_AA_Changes"];

console.log("before", JSON.stringify($data));

const $newData = {};
for (const entry of list_match) {
  const name = entry + ".xml";
  $newData[name] = $data[name];
}

console.log("after", JSON.stringify($newData));

请注意,它在这种情况下有效,因为属性名称看起来不像数组索引,它们是“自己的”属性。看起来像数组索引的属性名称不像其他属性名称那样按创建顺序列出。

再说一遍:强烈建议不要尝试使用对象属性顺序。

更多阅读:


* JSON.stringify 保证遵循顺序,但该 JSON 的 消费者 不一定。

【讨论】:

  • 伟大的解决方案 T.J Crowder,现在我是你的粉丝,谢谢....你太棒了
【解决方案2】:

您可以像这样使用数组中的顺序来访问对象属性

list_match.forEach(function(key) {
  var myData = $data[key];
  /* you can check that `myData` is not undefined */
})

【讨论】:

  • 抱歉,它包含 0 和 1 作为键
  • 哪个对象包含 0 和 1 ?你能更新你的第一篇文章吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多