Browse Source

Added Object.Keys() method (closes #22)

Dmitry Panov 8 years ago
parent
commit
38df25a940
2 changed files with 34 additions and 0 deletions
  1. 26 0
      runtime_test.go
  2. 8 0
      value.go

+ 26 - 0
runtime_test.go

@@ -2,6 +2,7 @@ package goja
 
 
 import (
 import (
 	"errors"
 	"errors"
+	"reflect"
 	"testing"
 	"testing"
 	"time"
 	"time"
 )
 )
@@ -759,6 +760,31 @@ func TestNilCallArg(t *testing.T) {
 	}
 	}
 }
 }
 
 
+func TestObjectKeys(t *testing.T) {
+	const SCRIPT = `
+	var o = { a: 1, b: 2, c: 3, d: 4 };
+	o;
+	`
+
+	vm := New()
+	prg, err := Compile("test.js", SCRIPT, false)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	res, err := vm.RunProgram(prg)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if o, ok := res.(*Object); ok {
+		keys := o.Keys()
+		if !reflect.DeepEqual(keys, []string{"a", "b", "c", "d"}) {
+			t.Fatalf("Unexpected keys: %v", keys)
+		}
+	}
+}
+
 /*
 /*
 func TestArrayConcatSparse(t *testing.T) {
 func TestArrayConcatSparse(t *testing.T) {
 function foo(a,b,c)
 function foo(a,b,c)

+ 8 - 0
value.go

@@ -708,6 +708,14 @@ func (o *Object) Get(name string) Value {
 	return o.self.getStr(name)
 	return o.self.getStr(name)
 }
 }
 
 
+func (o *Object) Keys() (keys []string) {
+	for item, f := o.self.enumerate(false, false)(); f != nil; item, f = f() {
+		keys = append(keys, item.name)
+	}
+
+	return
+}
+
 func (o *Object) Set(name string, value interface{}) (err error) {
 func (o *Object) Set(name string, value interface{}) (err error) {
 	defer func() {
 	defer func() {
 		if x := recover(); x != nil {
 		if x := recover(); x != nil {