Проблема: функция, которую я не объявил, присоединяется к области памяти переменной, которой я никогда не назначал ее?
Предыстория: у меня есть скрипт, созданный для удаления дублирующихся объектов путем сравнения значений ключей объектов. После инициализации переменной checkSum
и сразу после For...in loop
к переменной k
?
добавляется «призрачное» значение функции goodDiver.
'use strict';
const goodDiver = require('good-diver');
// This package uses good-diver to make things simple :)
// Read more about it here: https://github.com/starcrusherproductions/good-diver
/**
*
* @param {object} object object you want to truncate
* @param {array} keysToCheck array of the key's path using good-diver
* @param {array} keyMustBe array consition of boolean values of what corresponding keysToCheck must be.
*/
function goodRemover(object, keysToCheck, keyMustBe = Array(keysToCheck.length).fill(true)) {
// Initialize c as a count to cycle through the filter later on
let c = 0;
// Pump the data into a reference variable
let reference = object.map(r => {
// Initialize an empty array to store the keys of duplicates
let keys = [];
// Create an iteratable data object call it iterator
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries
let iterator = object.entries();
// Iterate through the data object to find the keys
for (let i of iterator) {
// THIS IS WHERE THE PROBLEM IS?
// Create an array called checkSum. We will see if checkSum[0].length===checkSum[1].length
let checkSum = [keysToCheck,[]];
// Debug: Expected result: object [ 'teamName', 'teamId' ] 2
console.log(typeof(checkSum[0]), checkSum[0], checkSum[0].length);
// Returned Result: object [ 'teamName', 'teamId' ] 2
// For each keysToCheck in checkSum[0]
for(let k in keysToCheck) {
// Simplify set keysToCheck[k] to key for simplification
let key = keysToCheck[k];
// Debug expected result: string, k
console.log(typeof(key), k);
/**
* Returned:
* string 0
* string 1
* function goodDiver
*/
// ^^^ END OF PROBLEM???
// For object iteration does any of
if((i[1].goodDiver(key) === r.goodDiver(key)) === keyMustBe[k] ){
// Yes push a value to the checkSum
checkSum[1].push(true)
}
}
// Does object iteration match a schema?
if(checkSum[0].length===checkSum[1].length) {
// Yes push it's keys i[0] into the tracker
keys.push(i[0]);
}
}
// Return the object keys
return { keys }
})
// Now map through the reference object
.map(r => {
// Does object iteration of the reference have more than 1 key?
if(r.keys.length>1 && r.keys[0]===c) {
// Yes. Increment the counter and return just the first element
c++;
return r.keys[0];
}
// It does not
else {
// Increment c. Return nothing.
c++;
}
})
// The nature of map returns undefined if there is nothing to return
// We need to filter out the undefineds and just return stuff that isn't undefined
.filter(r => {
// Return boolean test
return r!=null;
});
/**
* Initialize a new array and iterate through reference to
* return data sets that match conditions in reference
*/
//
let newData = [];
//
for(let r in reference) {
newData.push(object[reference[r]]);
}
return newData;
}
let objectWithDuplicates = [
{
id: 1,
teamId: 1,
franchiseId: 2,
teamName: 'Gulls'
},
{
id: 2,
teamId: 1,
franchiseId: 2,
teamName: 'Gulls'
}]
goodRemover(objectWithDuplicates,['teamName','teamId']);
Ссылка на goodDiver - один из моих других пакетов, good-diver . Если я удаляю зависимость, она не присваивает себя k. Это for... in loop
- единственное место, которое называется goodDiver
. Он не назначен никаким значениям. Он также не имеет переменных, объявленных под именем k. Оно делает; Однако работа над прототипом объекта.
Этот условный оператор - единственное место, где выполняется GoodDiver. Еще более странно, если я прокомментирую, что условное выполнение из GoodDiver все еще привязано к k?