Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js array.IndexOf不使用对象?_Javascript_Arrays_Object_Javascript Objects_Indexof - Fatal编程技术网

Javascript js array.IndexOf不使用对象?

Javascript js array.IndexOf不使用对象?,javascript,arrays,object,javascript-objects,indexof,Javascript,Arrays,Object,Javascript Objects,Indexof,我正在尝试创建一个包含日期和时间的对象的数组。我在一个可能存在重复的源上循环,所以每次我都要检查是否已经存储了当前日期和时间 然而,我总是得到重复的结果。所以我想array.indexOf可能不适用于对象 movies.forEach(function(movie){ if (days.indexOf(movie.day) !== -1) { //if the movie's day exists in our array of available days...

我正在尝试创建一个包含日期和时间的对象的数组。我在一个可能存在重复的源上循环,所以每次我都要检查是否已经存储了当前日期和时间

然而,我总是得到重复的结果。所以我想array.indexOf可能不适用于对象

    movies.forEach(function(movie){
        if (days.indexOf(movie.day) !== -1) { //if the movie's day exists in our array of available days...
            possibleMovies.push(movie);

            //create a day/time object for this movie
            dt = {day: movie.day, time: movie.time};

            //unless we already have this day and time stored away, do so
            if (possibleTimes.indexOf(dt) === -1) {
                possibleTimes.push(dt);
            }

        }
    });
循环完成后,可能的情况是:

[ { day: '01', time: '18:00' },
  { day: '01', time: '16:00' },
  { day: '01', time: '18:00' },
  { day: '01', time: '16:00' } ]
我希望三号线和四号线不在那里

----------更新----------

我变了

dt = {day: movie.day, time: movie.time};
进入这个

dt = JSON.stringify({day: movie.day, time: movie.time});
它的工作原理与预期一致。检索数据后只需对JSON.parse进行解析。

根据:

indexOf()
使用严格相等(与=或三重相等运算符使用的方法相同)将searchElement与数组的元素进行比较


这就是为什么
可能的原因。indexOf
总是导致-1。

如果两个对象指向同一位置,则认为它们相等

var obj1 = { x: 100 };
var obj2 = obj1;
console.log( obj1===obj2 );     //  outputs true

var obj1 = { x: 100 };
var obj2 = { x: 100 };
console.log( obj1===obj2 );     //  outputs false
您可以使用将每个对象转换为字符串,然后比较它们。请记住,属性的顺序必须匹配

console.log( JSON.stringify( obj1 ) === JSON.stringify( obj2) );    //outputs true
如果您愿意使用,它将变得非常简单:

let a = [
  { day: '01', time: '18:00' },
  { day: '01', time: '16:00' },
  { day: '01', time: '18:00' },
  { day: '01', time: '16:00' }
];

let b = R.uniq(a);
console.log(b);

对象是通过引用进行比较的,而不是它们的内容。哦,谢谢。我只是试着把它串起来,然后它就如预期的那样工作了,你刚才解释了为什么=)你应该看看www.lodash。com@MattWelander经常小心穿线。这是一个相对昂贵的操作,您可能只想迭代和测试过滤属性。如果性能非常重要,请考虑运行一些性能测试。“它变得非常容易”---但是,您的代码不能产生正确的结果。@ ZrkMs,假设您没有真正读取我发布的代码,只是运行JS bin。它一定是在我开始玩ES6 Set对象时被修改过的。注释的两行…取消注释。我已经更新了JS Bin示例。很抱歉给你带来了困惑。我已经很久没用了。