繁体   English   中英

Javascript Array 包括在 JSON.parse 之后返回 false

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM