js array.IndexOf不使用对象?

时间:2016-02-04 22:31:46

标签: javascript arrays object javascript-objects indexof

我正在尝试创建一个包含日期和时间的对象的数组。我正在循环一个可能存在重复的源,所以我想在每次没有存储当前日期和时间时进行检查。

然而,我一直以重复为目标。所以我认为array.indexOf可能不适用于对象?

{dd.map(function(result){
            console.log(result);
          })}

循环完成后,什么可能的时间成立:

    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};

它按预期工作。一旦我检索到数据,就需要JSON.parse。

3 个答案:

答案 0 :(得分:2)

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

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

您可以使用JSON.stringify将每个对象转换为字符串,然后进行比较。请记住,属性的顺序必须匹配。

console.log( JSON.stringify( obj1 ) === JSON.stringify( obj2) );    //outputs true

答案 1 :(得分:1)

如果你愿意使用Ramda,那就太容易了:

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);

http://jsbin.com/ligihexate/edit?js,console

答案 2 :(得分:0)

根据MDN

  

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

这就是为什么possibleTimes.indexOf总是导致-1。