IndexOf方法不像预期的那样工作


nodesData=[
{name:'name1'},
{name:'name2'},
{name:'name1'},
{name:'name3'},
]
uniqData=[
{name:'name1'}
{name:'name2'}
{name:'name3'}
]
for (let i = 0; i < nodesData.length; i += 2) {
const currentSource = nodesData[i];
const currentTarget = nodesData[i + 1];
const currentData = {
source: uniqData.indexOf(currentSource),
target: uniqData.indexOf(currentTarget),
};
}

我有两个带有对象的列表。第一个列表是包含名称的对象列表,另一个列表是使用我为删除重复项而创建的函数生成的列表。问题是,当我使用for循环和循环通过nodesData列表只有第一次我只得到源索引-1…为什么?和其他indexOf工作

所以console.log应该是:
source:-1, target:1
source:0, target:2

数组中的对象有不同的引用,即使它们看起来是相同的。基本上:

console.log({name: 'name1'} === {name: 'name1'}); // false

打印false,因为比较的对象没有相同的引用,即使它们相似。

所以在你的例子中,indexOf方法返回-1,因为对象没有相同的引用(再次,即使它们看起来是相等的)。

因为你不能直接使用indexOf,你必须先用find获得对象的引用,然后你可以使用indexOf,像这样:

const nodesData=[
{name:'name1'},
{name:'name2'},
{name:'name1'},
{name:'name3'},
]
const uniqData=[
{name:'name1'},
{name:'name2'},
{name:'name3'},
]
for (let i = 0; i < nodesData.length; i += 2) {
const currentSource = nodesData[i];
const currentTarget = nodesData[i + 1];
const currentData = {
source: uniqData.indexOf(uniqData.find(({name}) => name === currentSource.name)),
target: uniqData.indexOf(uniqData.find(({name}) => name === currentTarget.name)),
};

console.log(currentData);
}

注意:

我使用解构是为了直接获得name属性

最新更新