我有这两个数组:一个填充来自ajax请求的信息,另一个存储用户点击的按钮.我使用这段代码(我填写了样本号):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Run Code Online (Sandbox Code Playgroud)
但它始终给出false,即使两个数组相同,但名称不同.(我在Chrome的JS控制台中查看了这个).那么,有什么方法可以知道这两个数组是否包含相同的数据?它为什么要给予false?我如何知道第一个数组中的哪些值不在第二个数组中?
假设我们有一个Map : let m = new Map();, using m.values()返回一个map迭代器.
但是我不能使用forEach()或者map()在那个迭代器上并且在迭代器上实现while循环看起来像反模式,因为ES6提供了类似的功能map().
那么有没有办法map()在迭代器上使用?
根据官方JavaScript文档,您可以使用整数定义对象文字属性名称:
此外,您可以使用数字或字符串文字作为属性的名称.
像这样:
me = {
name: "Robert Rocha",
123: 26,
origin: "Mexico"
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,你如何引用具有整数作为名称的属性?我试过平常me.123但得到了一个错误.我能想到的唯一解决方法是使用for-in循环.有什么建议?
是否可以在Javascript中覆盖等价比较?
我得到的最接近的解决方案是定义valueOf函数并在对象前面用一个加号调用valueOf.
这有效.
equal(+x == +y, true);
Run Code Online (Sandbox Code Playgroud)
但这失败了.
equal(x == y, true, "why does this fail.");
Run Code Online (Sandbox Code Playgroud)
这是我的测试用例.
var Obj = function (val) {
this.value = val;
};
Obj.prototype.toString = function () {
return this.value;
};
Obj.prototype.valueOf = function () {
return this.value;
};
var x = new Obj(42);
var y = new Obj(42);
var z = new Obj(10);
test("Comparing custom objects", function () {
equal(x >= y, true);
equal(x <= y, true);
equal(x >= z, true);
equal(y >= z, true); …Run Code Online (Sandbox Code Playgroud) 我开始时:
"1:2".split(':') == ["1","2"];
// false
Run Code Online (Sandbox Code Playgroud)
然后尝试:
[1,2] == [1,2];
// false
Run Code Online (Sandbox Code Playgroud)
最终:
[] == [];
// false
Run Code Online (Sandbox Code Playgroud)
我发现了:
"1:2".split(':').toString() == [1,2].toString();
// true
Run Code Online (Sandbox Code Playgroud)
所以我已经解决了我的初始问题(种类),但为什么数组不能相互匹配?
有一种简单的方法可以验证ES6 Set是否包含特定数组的值?我想要一个不需要我使用引用的解决方案:
var set = new Set();
var array = [1, 2];
set.add(array);
set.has(array); // true
set.add([3, 4]);
set.has([3, 4]); // false
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的解决方案是将所有内容存储为字符串,但这很烦人:
set.add([3, 4].toString());
set.has([3, 4].toString()); // true
Run Code Online (Sandbox Code Playgroud) 如何在对象中使用 Set()?我阅读了文档,它适用于数组中的值,但不适用于对象。为什么?我想避免具有完全相同值的重复项。
let nameList_one = [{ name: 'harry', id: 1 }, { name: 'john', id: 2 }, { 'name': 'trevor', id: 3 }]
let nameList_two = [{ name: 'harry', id: 1 }, { name: 'ron', id: 4 }, { name: 'jackson', id: 5 }]
let fullNameList = [...nameList_one , ...nameList_two ]
let filteredList = [...new Set(fullNameList)] // the output is the merge of two array, duplicating "harry".
Run Code Online (Sandbox Code Playgroud)
输出:
[{ name: 'harry', id: 1 }, { name: 'john', id: 2 }, …
在检查地图是否已经具有对象作为键时遇到一些麻烦。
例如
const myMap: Map<MyObject1, MyObject2> = new Map<MyObject1, MyObject2>();
Run Code Online (Sandbox Code Playgroud)
我还在MyObject1类中定义了一个equals函数
equals(other: ThreatAgentMgm): boolean {
return other.id === this.id;
}
Run Code Online (Sandbox Code Playgroud)
但myMap.has(myObject1)总是错误的。我读了has方法基于===运算符,我应该在MyObject1类中定义其他内容吗?
我正在尝试构建唯一的数组数组,这样每当我有新数组添加它时,只应添加它,如果它不存在于集合中
例如,存储[1,1,2]的所有唯一排列
实际:[[1,1,2],[1,2,1],[1,1,2],[1,2,1],[2,1,1],[2,1,1]]
预期:[[1,1,2],[1,2,1],[2,1,1]]
我试过的方法:
uniqueArrComparer都是对该数组元素的唯一对象引用.function uniqueArrComparer(value, index, self) {
return self.indexOf(value) === index;
}
result.filter(uniqueArrComparer)
Run Code Online (Sandbox Code Playgroud)
设置/映射:我认为我可以构建一个唯一的数组,但它不起作用,因为Set内部使用了严格的相等比较器(===),它将在这种情况下将每个数组视为唯一.
我们无法为JavaScript Set自定义对象相等性
将每个数组元素作为字符串存储在Set/Map/Array中,并构建一个唯一字符串数组.在最后使用唯一字符串数组构建数组数组.这种方法可行,但看起来不是有效的解决方案.
let result = new Set();
// Store [1,1,2] as "1,1,2"
result.add(permutation.toString());
return Array.from(result)
.map(function(permutationStr) {
return permutationStr
.split(",")
.map(function(value) {
return parseInt(value, 10);
});
});Run Code Online (Sandbox Code Playgroud)
这个问题比任何应用程序问题更像是一种学习练习.
使用ES6集,我可以这样做:
let ints = new Set([1,2,3])
console.log(ints.has(3))
Run Code Online (Sandbox Code Playgroud)
而且它打印true,因为3 是在集合.
但阵列怎么样?例如
let coordinates = new Set([[1,1], [1,2], [2,0]])
console.log(coordinates.has([1,2]))
Run Code Online (Sandbox Code Playgroud)
这打印false.
因此,在没有首先将坐标转换为字符串(例如['1,1', '1,2', '2,0'])的情况下,我如何处理集合中的数组,就像数组是可以清除的一样?
javascript ×9
arrays ×5
ecmascript-6 ×4
dictionary ×2
set ×2
compare ×1
equality ×1
filter ×1
iterator ×1
object ×1
qunit ×1
syntax ×1
typescript ×1
unique ×1