.filter不能以正确的顺序返回对象

时间:2020-04-23 15:10:22

标签: javascript

我有一个带有ID的对象(建议)数组和一个仅包含ID(属性)的数组。我需要使用在属性中具有相似ID的建议中的对象创建一个新数组。

suggestions: 

Name:"NAME_1"
Value:"16"
id:"295748b6-bf55-4225-add8-aaf000e4825a"


Name:"NAME_2"
Value:"something"
id:"68a65c6d-5a09-4e8a-8583-aaf000e4825a"

Name:"NAME_3"
Value:"4"
id:"69984329-eed1-47a2-8806-aaf000e4825a"

...

属性:

attributes:Array[3]
0:"69984329-eed1-47a2-8806-aaf000e4825a"
1:"295748b6-bf55-4225-add8-aaf000e4825a"
2:"68a65c6d-5a09-4e8a-8583-aaf000e4825a"

功能:

const chosenAttributes = this.suggestions.filter(
    item => this.attributes.includes(item.id)
    );
    this.chosenAttributes = chosenAttributes;

输出:

chosenAttributes:Array[3]
0:Object
Name:"NAME_1"
Value:"16"
id:"295748b6-bf55-4225-add8-aaf000e4825a"
1:Object
Name:"NAME_2"
Value:"something"
id:"68a65c6d-5a09-4e8a-8583-aaf000e4825a"
2:Object
Name:"NAME_3"
Value:"4"
id:"69984329-eed1-47a2-8806-aaf000e4825a"

这可行,但是我需要使新数组(chosenAttributes)中的对象与它们的ID出现在我的属性数组中的顺序相同。我不确定为什么从一开始就没有正确订购它们。

Vue 2.6.11

2 个答案:

答案 0 :(得分:2)

Array.filter不会更改初始数组的顺序,在您的情况下为suggestions。如果您想要其他顺序(attributes数组的顺序),则必须在额外的步骤中对新数组进行排序。

chosenAttributes.sort ( function (a, b)
{
    return this.attributes.indexOf (a.id) - this.attributes.indexOf (b.id);
});

答案 1 :(得分:0)

听起来您只需要使用Javascript的Array sort方法即可:

const chosenAttributes = this.suggestions
  .filter(
    item => this.attributes.includes(item.id)
  )
  .sort(item => /* return 1, 0, or -1 to indicate sorting */);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort有更多详细信息。