有没有办法扩展JavaScript对象数组?

时间:2018-02-15 23:09:42

标签: javascript

在JavaScript中,您可以使用原型扩展对象的功能。

Person.prototype.fullName = function () {
    return this.first + this.last;
};

我遇到很多情况,我需要在特定对象数组上处理某些事情。在这种情况下,将功能链接到该对象类型会很好,而不是仅仅作为数组参数传递。 我知道扩展JavaScript数组没有任何建议。

是否有扩展对象数组功能的等效标准?这是我的意思的一个伪示例:

Person(Array).prototype.groupByAges = function () {
    // logic here that would group by ages
    // { '0-15': [person, person], '16-18': [person, person], etc. }

    return list;
};

// could be used like this
const list = persons.groupByAges();

我尝试过:

  1. 编写getAgeGroupsByPerson(arr)之类的函数,最终导致代码混乱
  2. JQuery.grep()和JavaScript arr.map()有助于但不将功能与特定对象类型相关联。
  3. 注意:我意识到可能有更好的方法来逻辑地解决我所描述的特定年龄分组问题。这只是一个证明我的观点的例子。谢谢。

2 个答案:

答案 0 :(得分:2)

我看到两种不同的方法可以满足您的要求

1)编写一个扩展Array的类并将数组放在那里

class MyArray extends Array {
  groupByAge() {
    console.log(this);
  }
}


let a = MyArray.from([1,2,3]);
a.groupByAge();

2)编写一个普通函数,它接受一个对象数组并对其进行处理。

function groupByAge(array) {
   console.log(this);
}

尝试扩展新的Array函数IMO比完成上述两项工作还要付出更多的工作而不是回报。如果JS课程不是你可以利用的东西,那么我建议你去寻找这个功能,只需要打电话给#34;无处不在"。

这两种方法的优点是它们很容易测试,而且这是我们想要的东西。

答案 1 :(得分:1)

您可以装饰arrays



let decorate = (array) => {
  array.groupByAges = function() {
   console.log(`Grouping = ${this}`);
  }  
  return array;
}

decorate([1,2,3]).groupByAges();