为什么所有的数组都删除了这个集合中的一个元素而不是被引用的元素?

Why are all of the arrays deleting an element in this set instead of the one being referenced?

我的代码:

uniformPieces3 = ['company1_hat', 'company1_glasses', 'company2_hat']
uniformSet3 = ['hat', 'glasses']


f1 = function(uniformSet, uniformPieces) {

uniformPieces.sort();
let arr1 = []
for (i = 0; i < uniformPieces.length; i++){
    arr1[i] = uniformPieces[i].substr(0, uniformPieces[i].indexOf('_'))
}
let hold = new Set(arr1);
let missingPieces = new Set
hold.forEach(element => missingPieces[element] = uniformSet);



uniformPieces.forEach(e=>{
  let t = e.split('_');
  if(missingPieces.hasOwnProperty(t[0])){
    var index = missingPieces[t[0]].indexOf(t[1]);

    if (index !== -1) {
      console.log(t[0])
      missingPieces[t[0]].splice(index, 1);
     
    }

  }
  });

  console.log(missingPieces)

}

f1(uniformSet3, uniformPieces3);

当我在 misingPieces 上调用 splice() 时,它删除了每个数组中的一个元素,而不是集合中的特定数组。例如:

Set(0) {
  company1: [ 'hat', 'glasses' ],
  company2: [ 'hat', 'glasses' ]}

然后 missingPieces[t[0]].splice(index, 1) 被调用,它应该删除一个元素,但却产生:

Set(0) { company1: [ 'hat' ], company2: [ 'hat' ] }

从而从集合中的所有数组中删除该元素。

我想快速阅读一下,您正在存储相同的参考 (uniformSet),因此当您拼接一个时,它会拼接所有(因为它们实际上都是相同的参考)

尝试复制uniformSet而不是直接赋值

  hold.forEach(element => missingPieces[element] = [...uniformSet]);

(我没有测试这个)

Non-primitive 数据类型为 passed by reference。如果您想创建一个副本而不是为同一引用创建另一个变量,则需要 clone/copy 所有值。如果你在这里使用第二行,my_objectanother_variable_for_same_reference 指的是同一个对象。

let my_object = {};
let another_variable_for_same_reference = my_object;
let object_with_copied_values = {...my_object};