通过嵌套对象重新循环时,请保持原始密钥



我有一个带子对象和数组的嵌套对象。这样的东西:

const documents = {
    invoice: {
        documentID: '_e4564',
        displayName: '2019-02-03',
        url: 'https://www.urltoinvoice.com'
    },
    conditions: {
        documentID: '_e9365',
        displayName: 'Conditions company x',
        url: 'https://www.urltoconditions.com'
    },
    reminders: [
        {
            documentID: '_e4364',
            displayName: 'First reminder',
            url: 'https://www.urltofirstreminder.com'
        },
        {
            documentID: '_e0254',
            displayName: 'Second reminder',
            url: 'https://www.urltosecondreminder.com'
        },
    ]
}

我正在尝试创建一个新的对象数组,以在选择框中使用。子对象需要相同的属性,但具有基于文档类型的更新显示名称。因此,例如,提醒:首先提醒。

目前,这是我的代码:

const newArray = [];
this.addDocumentToArray(documents, newArray);

和addDocumentToArray函数:

addDocumentToArray = (documents, arr) => {
    Object.entries(documents).forEach(([key, val]) => {
        if (Array.isArray(val)) {
            this.addDocumentToArray(val, arr);
        } else {
            arr.push({ documentID: val.documentID, displayName: `${key}: ${val.displayName}` });
        }
    });
}

此时的输出是一个看起来像这样的数组:

0: {documentID: "_e4564", displayName: "invoice: 2019-02-03"}
1: {documentID: "_e9365", displayName: "conditions: Conditions company x"}
2: {documentID: "_e4364", displayName: "0: First reminder"}
3: {documentID: "_e0254", displayName: "1: Second reminder"}

几乎可以,但是提醒的关键是01。如何将reminder(或提醒)作为键?

您可以将第三个可选参数添加到功能标签中。您仅在您的值为数组时才传递该参数,并且它将该值用作键

addDocumentToArray = (documents, arr, labelKey) => {
        Object.entries(documents).forEach(([key, val]) => {
            if (Array.isArray(val)) {
                this.addDocumentToArray(val, arr, key);
            } else {
                arr.push({ documentID: val.documentID, displayName: `${labelKey || key}: ${val.displayName}` });
            }
        });
    }

我真的很喜欢Chriss的答案,所以我会尝试写一个替代方案:

let currentKey = null;
addDocumentToArray = (documents, arr) => {
Object.entries(documents).forEach(([key, val]) => {
    if (Array.isArray(val)) {
        let prevKey = currentKey;
        currentKey = key;
        this.addDocumentToArray(val, arr);
        currentKey = prevKey;
    } else {
        arr.push({ documentID: val.documentID, displayName: `${currentKey || key}: ${val.displayName}` });
    }
    });
}

最新更新