通过匹配其他数组来更改对象属性的位置

时间:2017-10-28 10:31:29

标签: javascript jquery

我有一个对象

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"
}

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

2 个答案:

答案 0 :(得分:2)

可以在完全兼容的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的使用者不一定。

答案 1 :(得分:0)

您可以使用数组中的顺序来访问对象属性,如此

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