1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
// Copyright (C) 2018 Shilpi Jain and Michael Ficarra. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-array.prototype.flatMap
description: >
array-like objects can be flattened
info: |
Array.prototype.flatMap ( mapperFunction [ , thisArg ] )
1. Let O be ? ToObject(this value).
2. Let sourceLen be ? ToLength(? Get(O, "length")).
...
5. Let A be ? ArraySpeciesCreate(O, 0).
...
ArraySpeciesCreate ( originalArray, length )
3. Let isArray be ? IsArray(originalArray).
4. If isArray is false, return ? ArrayCreate(length).
FlattenIntoArray(target, source, sourceLen, start, depth [ , mapperFunction, thisArg ])
1. Let targetIndex be start.
2. Let sourceIndex be 0.
3. Repeat, while sourceIndex < sourceLen
a. Let P be ! ToString(sourceIndex).
b. Let exists be ? HasProperty(source, P).
c. If exists is true, then
...
** Skip if property does not exist **
includes: [compareArray.js]
features: [Array.prototype.flatMap]
---*/
function fn(e) {
return [39, e * 2]; // returns an array to observe it being flattened after
}
var a;
var actual;
a = {
length: 3,
0: 1,
// property 1 will be fully skipped
2: 21,
get 3() { throw 'it should not get this property'; }
};
actual = [].flatMap.call(a, fn);
assert.compareArray(actual, [39, 2, 39, 42], 'The value of actual is expected to be [39, 2, 39, 42]');
assert.sameValue(Object.getPrototypeOf(actual), Array.prototype, 'Object.getPrototypeOf([].flatMap.call(a, fn)") returns Array.prototype');
a = {
length: undefined,
get 0() { throw 'it should not get this property'; },
};
actual = [].flatMap.call(a, fn);
assert.compareArray(actual, [], 'The value of actual is expected to be []');
assert.sameValue(Object.getPrototypeOf(actual), Array.prototype, 'Object.getPrototypeOf([].flatMap.call(a, fn)") returns Array.prototype');
var called = false;
a = {
get length() {
if (!called) {
called = true;
return 2;
} else {
throw 'is should get the length only once';
}
},
0: 21,
1: 19.5,
get 2() { throw 'it should not get this property'; },
};
actual = [].flatMap.call(a, fn);
assert.compareArray(actual, [39, 42, 39, 39], 'The value of actual is expected to be [39, 42, 39, 39]');
assert.sameValue(Object.getPrototypeOf(actual), Array.prototype, 'Object.getPrototypeOf([].flatMap.call(a, fn)") returns Array.prototype');
a = {
length: 10001,
[10000]: 7,
};
actual = [].flatMap.call(a, fn);
assert.compareArray(actual, [39, 14], 'The value of actual is expected to be [39, 14]');
assert.sameValue(Object.getPrototypeOf(actual), Array.prototype, 'Object.getPrototypeOf([].flatMap.call(a, fn)") returns Array.prototype');
reportCompare(0, 0);
|