[英]Javascript Array includes returning false after JSON.parse
我在 javascript 中创建一个数组,将一个元素插入其中,然后使用includes
检查它的存在。 它返回真。 但是,当我使用JSON.stringify
将数组转换为字符串,然后使用JSON.parse
转换回数组,然后对其进行测试时,它返回 false。
这让我很困惑。
var test_object = {'id': 1, 'name': 'Test'}; var initial = []; initial.push(test_object); console.log(initial.includes(test_object)); var later = JSON.stringify(initial); later = JSON.parse(later); console.log(later.includes(test_object));
这是一个相同的jsbin 。
当您运行json.parse
您将返回一个新对象。 对象在使用由身份而不是值进行比较includes
,这就是为什么它返回false。 如果您愿意,可以修改includes
原型(尽管我不建议这样做)以进行更深入的对象比较
Array.prototype.includes = function(searchElement /*, fromIndex*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.includes called on null or undefined');
}
var O = Object(this);
var len = parseInt(O.length, 10) || 0;
if (len === 0) {
return false;
}
var n = parseInt(arguments[1], 10) || 0;
var k;
if (n >= 0) {
k = n;
} else {
k = len + n;
if (k < 0) {k = 0;}
}
var currentElement;
while (k < len) {
currentElement = O[k];
if (JSON.stringify(searchElement) === JSON.stringify(currentElement) || searchElement === currentElement ||
(searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN
return true;
}
k++;
}
return false;
};
请注意,此代码基于Array.prototype.includes
polyfill 。
正如 winhowes 所述,包括通过身份而非价值进行的检查。
你可以试试这个:
if (!Array.prototype.includesCallback) {
Array.prototype.includesCallback = function(predicate) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.includeCallback called on null or undefined');
}
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
var list = Object(this);
var length = list.length >>> 0;
var thisArg = arguments[1];
var value;
for (var i = 0; i < length; i++) {
value = list[i];
if (predicate.call(thisArg, value, i, list)) {
return true;
}
}
return undefined;
};
}
这将让您利用一个函数来执行比较
later.includesCallback (
function(item) {
return item.id === test_object.id;
}
);
Array.prototype.includesEquivalent = function (obj) { for (var o in this) { for (var p in this[o]) { if (this[o][p] !== obj[p]) { return false; } } } return true; } var test_object = {'id': 1, 'name': 'Test'}; var initial = []; initial.push(test_object); console.log(initial.includes(test_object)); var later = JSON.stringify(initial); later = JSON.parse(later); console.log(later.includesEquivalent(test_object));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.