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
属性