扩展js对象数组的OrderByAsc和OrderByDesc方法

JavaScript012

扩展js对象数组的OrderByAsc和OrderByDesc方法,第1张

看了一段时间关于js原型的知识 js的扩展方法是基于原型的 如Array prototype XXXX就是给Array扩展XXX方法 然后数组都能使用这个方法了

在对象数组里面经常有根据属性来进行排序的 升序 降序的 于是自己就想写一个类似于C#里面的orderBy的方法 代码如下

代码如下:

Array prototype OrderByAsc = function (func) {

var m = {}

for (var i = i <this lengthi++) {

for (var k = k <this lengthk++) {

if (func(this[i]) <func(this[k])) {

m = this[k]

this[k] = this[i]

this[i] = m

}

}

}

return this

}

Array prototype OrderByDesc = function (func) {

var m = {}

for (var i = i <this lengthi++) {

for (var k = k <this lengthk++) {

if (func(this[i]) >func(this[k])) {

m = this[k]

this[k] = this[i]

this[i] = m

}

}

}

return this

}

调用的方法如下

代码如下:

var arr = [{ name: aaa grade: } { name: ccc grade: } { name: bbb grade: }]

var orderArr = arr OrderByDesc(function (a) {

return a grade

})

然后输出一下 看一下结果吧

代码如下:

for (var i = i <orderArr lengthi++) {

document write(orderArr[i] name)

lishixinzhi/Article/program/Java/JSP/201311/19823

Function.prototype.method=function(name,func){

this.prototype[name]=func

return this

}

String.method('trim',function(){

if('trim' in this){

return this.trim)

}else{

return this.replace(/^\s+|\s+$/g,'')

}

})

上面的代码为Function原型提供了一个method方法,通过它可以为原型添加新的方法

为String原型添加一个trim方法原意为当调用对象或上下文存在trim属性的话,就调用原来的trim方法,否则就调用replace方法

一、编写Node.js原生扩展

Node.js是一个强大的平台,理想状态下一切都都可以用javascript写成。然而,你可能还会用到许多遗留的库和系统,这样的话使用c++编写Node.JS扩展会是一个不错的注意。

以下所有例子的源代码可在node扩展示例中找到 。

编写Node.js C + +扩展很大程度上就像是写V8的扩展; Node.js增加了一些接口,但大部分时间你都是在使原始的V8数据类型和方法,为了理解以下的代码,你必须首先阅读V8引擎嵌入指南。

Javascript版本的Hello World

在讲解C++版本的例子之前,先让我们来看看在Node.js中用Javascript编写的等价模块是什么样子。这是一个最简单的Hello World,也不是通过HTTP,但它展示了node模块的结构,而其接口也和大多数C++扩展要提供的接口差不多:

HelloWorldJs = function() {

this.m_count = 0

}

HelloWorldJs.prototype.hello = function()

{

this.m_count++

return “Hello World”

}

exports.HelloWorldJs = HelloWorldJs

正如你所看到的,它使用prototype为HelloWorldJs类创建了一个新的方法。请注意,上述代码通过将HelloWorldJS添加到exports变量来暴露构造函数。

要在其他地方使用该模块,请使用如下代码:

var helloworld = require(‘helloworld_js’)

var hi = new helloworld.HelloWorldJs()

console.log(hi.hello())// prints “Hello World” to stdout

C++版本的Hello World

要开始编写C++扩展,首先要能够编译Node.js(请注意,我们使用的是Node.js 2.0版本)。本文所讲内容应该兼容所有未来的0.2.x版本。一旦编译安装完node,编译模块就不在需要额外的东西了。

完整的源代码可以在这里找到 。在使用Node.js或V8之前,我们需要包括相关的头文件:

#include <v8.h>

#include <node.h>

using namespace node

using namespace v8

在本例子中我直接使用了V8和node的命名空间,使代码更易于阅读。虽然这种用法和谷歌的自己的C++编程风格指南相悖,但由于你需要不停的使用V8定义的类型,所以目前为止的大多数node的扩展仍然使用了V8的命名空间。

接下来,声明HelloWorld类。它继承自node::ObjectWrap类 ,这个类提供了几个如引用计数、在V8内部传递contex等的实用功能。一般来说,所有对象应该继承ObjectWrap:

class HelloWorld: ObjectWrap

{

private:

int m_count

public:

声明类之后,我们定义了一个静态成员函数,用来初始化对象并将其导入Node.js提供的target对象中。设个函数基本上是告诉Node.js和V8你的类是如何创建的,和它将包含什么方法: