TypeScript/JavaScript中的array.indexOf

Hon*_*iao 9 javascript typescript

更新:虽然这个问题被标记为与重复.但@ssube的方式很整洁,更聪明.

UPDATE2:@Grungondola的评论似乎有新方法.

我正在使用Typescript.

这很好用.

var array1 = [];
array1.push(5);
array1.push(6);
console.log("a", array2.indexOf(6));
Run Code Online (Sandbox Code Playgroud)

但这不行.因为array2.indexOf返回-1,这意味着它找不到它.

var array2 = [];
array2.push({aa:5,bb:5});
array2.push({aa:6,bb:6});
console.log(array2.indexOf({aa:6,bb:6}));
Run Code Online (Sandbox Code Playgroud)

看起来indexOf不支持Object.TypeScript有自己的方法来处理这类问题吗?谢谢.

ssu*_*ube 23

不是.问题不Object在于,而在于您正在创建两个不同的对象.

object literal syntax({foo: 'bar'})声明一个内联对象.执行脚本时,将创建对象.多次使用该语法会创建多个对象.

您可以轻松地测试它{foo: 3} === {foo: 3}.这将评估为false,但它们不是同一个对象(引用).

indexOf方法检查数组中是否存在对象,字符串,数字等.您正在传递一个不在数组中的新对象.

如果你有对象的引用,你可以使用它indexOf并将工作:

var foo = {aa:5,bb:5}, bar = {aa:6,bb:6};
var array2 = [];
array2.push(foo);
array2.push(bar);
console.log(array2.indexOf(foo));
Run Code Online (Sandbox Code Playgroud)

因为您指的是同一个实例,所以这将打印索引.

您还可以使用filterfind使用谓词执行深度搜索:

function deepIndexOf(arr, obj) {
  return arr.findIndex(function (cur) {
    return Object.keys(obj).every(function (key) {
      return obj[key] === cur[key];
    });
  });
}

var array2 = [];
array2.push(foo);
array2.push(bar);
console.log(deepIndexOf(array2, foo));
Run Code Online (Sandbox Code Playgroud)

这不会递归到嵌套对象中,但会完成您正在寻找的比较(两个对象及其直接字段的等效性).