Javascript 如何跳过键值对中未定义/缺少的值

Javascript 如何跳过键值对中未定义/缺少的值,javascript,key-value,Javascript,Key Value,我正试图从API中的json构建一个引用生成器,其中包含存储在键值对中的图像数据。我可以将数据返回到屏幕,但引用中总是包含未定义的数据。返回未定义的创建者,因为该创建者未在此特定记录中列出。如何防止任何未定义的值被返回?我尝试将forEach更改为map,使用if!==按字符串长度过滤所有元数据插入时未定义,以及代码中不同位置的版本 编辑:更新以提供完整代码,包括打印到页面 (function () { 'use strict'; const buildCitation = { bui

我正试图从API中的json构建一个引用生成器,其中包含存储在键值对中的图像数据。我可以将数据返回到屏幕,但引用中总是包含未定义的数据。返回未定义的创建者,因为该创建者未在此特定记录中列出。如何防止任何未定义的值被返回?我尝试将forEach更改为map,使用if!==按字符串长度过滤所有元数据插入时未定义,以及代码中不同位置的版本

编辑:更新以提供完整代码,包括打印到页面

(function () {
'use strict';

const buildCitation = {
    buildMetadataObject: async function (collAlias, itemID) {
        let response = await fetch('/iiif/info/' + collAlias + '/' + itemID + '/manifest.json');
        let data = await response.json()
        let allMetadata = data.metadata
        let citationData = {};
        allMetadata.forEach(function (kvpair) {
            if (kvpair.value == undefined) {
                return false;
            } else if (kvpair.label === 'Title') {
                citationData.itemTitle = kvpair.value;
            } else if (kvpair.label === 'Creator') {
                citationData.itemCreator = kvpair.value;
            } else if (kvpair.label === 'Repository') {
                citationData.itemRepository = kvpair.value;
            } else if (kvpair.label === 'Collection Name') {
                citationData.itemCollection = kvpair.value;
            } else if (kvpair.label === 'Owning Institution') {
                citationData.itemOwning = kvpair.value;
            } else if (kvpair.label === 'Date') {
                citationData.itemDate = kvpair.value;
            } else if (kvpair.label === 'Storage Location') {
                citationData.itemStorage = kvpair.value;
            }
        return true;
        });
        return citationData;
    },
    insertCitation: function (data) {
        var testTitle = data.itemTitle;
        console.log(testTitle);
        const itemCite = `Citation: "${data.itemTitle}," ${data.itemDate}, ${data.itemCreator}, ${data.itemCollection}, ${data.itemOwning}, ${data.itemStorage}, ${data.itemRepository}.`;
        const citationContainer = document.createElement('div');
        citationContainer.id = 'citation';
        citationContainer.innerHTML = itemCite;

        // CHANGED to innerHTML instead of innerText because you may want to format it at some point as HTML code.

        if (testTitle) {
            document.querySelector('.ItemView-itemViewContainer').appendChild(citationContainer);
        }
    }
}

document.addEventListener('cdm-item-page:ready', async function (e) {
    const citationData = await buildCitation.buildMetadataObject(e.detail.collectionId, e.detail.itemId);
    console.log({ citationData });
    buildCitation.insertCitation(citationData);
});

document.addEventListener('cdm-item-page:update', async function (e) {
    document.getElementById('citation').remove();
    const citationData = await buildCitation.buildMetadataObject(e.detail.collectionId, e.detail.itemId);
    console.log({ citationData });
    buildCitation.insertCitation(citationData);
});

})()

我简化了你的程序。未定义的原因是没有带有标签
Date

const映射={
日期:“itemDate”,
标题:“itemTitle”,
创建者:“itemCreator”,
存储库:“itemRepository”,
“存储位置”:“itemStorage”,
“拥有机构”:“拥有项目”,
“集合名称”:“itemCollection”,
}
异步函数buildMetadataObject(collias,itemID){
let response=等待取数('https://teva.contentdm.oclc.org/iiif/info/p15138coll25/1421/manifest.json');
let data=wait response.json()
返回data.metadata.reduce(
(acc,{label,value})=>({…acc,[mappings[label]]:value}),
{}
)
}
函数插入(数据){
var testTitle=data.itemTitle;
常量字段黑名单=['itemTitle'];
const itemCite=`引文:${data.itemTitle},“${
Object.values(映射).reduce((acc,cur)=>{
if(fieldBlackList.includes(cur))返回acc;
常量值=数据[cur];
返回值?[…acc,value]:acc
},[])。连接(“,”)
}.`;
console.log(itemCite);
}
//主程序
(异步()=>{
const引文数据=等待buildMetadataObject();
插入(引文数据);

})()
你好。你能详细说明一下
未定义的
对你意味着什么吗?不确定
未定义的
在这里,我运行了你的代码,它似乎返回了一个没有任何未定义属性或值的对象,
{“itemTitle”:“Market Street”,“itemCreator”:“Calvert Brothers”,“itemCollection”:“Library Photo Collection”,“itemOwning”:“田纳西州图书馆和档案馆”,“itemStorage”:“18号抽屉,文件夹184”,“itemRepository”:“田纳西州虚拟档案馆”}
forEach的回调返回布尔值的目的是什么?所述方法对返回值不做任何处理,从回调返回只是将迭代移动到下一轮。-我没有看到任何错误。我甚至不知道你怎么会有错误,因为JSON甚至没有任何方法来标记
未定义的
-反序列化后该值不能存在。@未定义意味着它不存在。这一对没有价值。它不会出现在记录中,但当我应用代码时。