Итак, я прошел учебник по Record Collection и достаточно хорошо разбираюсь в исходном вызове. Тем не менее, я хочу, чтобы моя функция могла добавить новый идентификатор в коллекцию, если она еще не существует. Я пробовал так много вариантов, и я не могу понять, как это сделать (noob -_-). Я знаю, что в этом нет необходимости, но я думаю, что это в любом случае поможет моему общему пониманию объектов и массивов.

Код ниже - моя последняя попытка. Первое утверждение if - это моё дополнение. Должен ли я сначала выполнить оператор if с .hasOwnProperty? ИДК . Пожалуйста, объясните в фиктивных условиях. :)

var collection = {
    2548: {
        album: "Slippery When Wet",
        artist: "Bon Jovi",
        tracks: [
            "Let It Rock",
            "You Give Love a Bad Name"
        ]
    },
    2468: {
        album: "1999",
        artist: "Prince",
        tracks: [
            "1999",
            "Little Red Corvette"
        ]
    },
    1245: {
        artist: "Robert Palmer",
        tracks: []
    },
    5439: {
        album: "ABBA Gold"
    }
};

function updateRecords(id, prop, value) {

// If the id is not blank and the prop is not blank,
    if (id !== "" && prop !== "") {

// then create the new id name and push the property onto it.
        collection.id = [];
        collection[id].push(prop);
    }

//If the property is equal to "tracks" and the tracks value isn't empty,
    else if (value !== "" && prop === "tracks") {

//update or set the value for the property.
        collection[id][prop].tracks;

//If the specificied id doesn't have the property tracks,
    } else if (!collection[id].hasOwnProperty("tracks")) {

//then add the property tracks and push in the track's name value       
        collection[id].tracks = [];
        collection[id].tracks.push(value);

//Otherwise delete the id entirely.
    } else {

    delete collection[id][prop];
    }

    return collection;
}

updateRecords(2005, "tracks", "check on it");

-2
95sendHelpGirl 21 Дек 2019 в 04:22

2 ответа

Лучший ответ

Если вы пытаетесь убедиться, что запись не существует, прежде чем добавить ее в коллекцию, самый простой способ сделать это - использовать что-то вроде Array.find.

Приведенный ниже код проверяет только поле id, чтобы увидеть, существует ли оно уже. В вашем сценарии вы можете проверить другие свойства, поэтому у вашего .find будут дополнительные проверки.

Примере:

const records = [
  { id: 1, name: 'Test1' },
  { id: 2, name: 'Test2' },
  { id: 3, name: 'Test3' },
  { id: 4, name: 'Test4' },
];

const addRecord = (record) => {
  if (record) {
    const existingRecord = records.find(r => r.id === record.id);
    if (existingRecord) { return `Record ${record.id} already exists`; }
    records.push(record);
    return records;
  }
  return 'Record cannot be falsy';
}

console.log(addRecord({ id: 5, name: 'Test5' })); // Adds record
console.log(addRecord({ id: 1, name: 'Test123123123 doesnt matter' })); // Record already exists

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Пример с коллекцией object вместо array из objects

let records = {
  1: { name: 'Test1' },
  2: { name: 'Test2' },
  3: { name: 'Test3' },
  4: { name: 'Test4' }
};

const findRecord = (recordId) => {
  for(const key in records) {
    if (+key === recordId) return records[key];
  }
  return null;
};

const addRecord = (id, name) => {
  if (id && name) {
    const recordExists = findRecord(id);
    if (recordExists) return `Record ${id} already exists`;
    records[id] = { name };
    return records;
  }
  return 'Record cannot be falsy';
};

console.log(addRecord(5, 'Test5')); // Adds record
console.log(addRecord(1, 'blag asdfsdafafds')); // Already exists
-1
mwilson 21 Дек 2019 в 01:56

Еще один способ сделать это:

let records = {
    1: { name: 'Test1' },
    2: { name: 'Test2' },
    3: { name: 'Test3' },
    4: { name: 'Test4' }
}

const addRecord = (id, name) => {
    if (!id || !name) {
        return 'Id and name must be defined'
    }

    const exists = Object.keys(records).some(recordId => +recordId === id)

    if (exists) {
        return `${id} already exists`
    }

    records[id] = { name }

    return records
}

console.log(addRecord(5, 'Test5')) // Adds record
console.log(addRecord(1, 'blag asdfsdafafds')) // Already exists
-2
Eudoxus 21 Дек 2019 в 02:26