簡體   English   中英

在javascript中按路徑將值推送到數組中

[英]Push value into array by path in javascript

我想知道是否有一種簡單的方法可以在JavaScript中完成以下內容

我已有的代碼:

var formattedObject = {
    "id": "1"
};
var mapping = {
    "name": "name",
    "project": "projects.0.name"
};
$.each(mapping, function(path, fieldName) {
    fieldValue = $('form input[name="' + fieldName + '"]').val();
    /*
        Here I need to push a field value into array by path
    */
});

我希望我的格式化對象看起來像:

var formattedObject = {
    "id": "1",
    "name": "Object name", //comes from input field
    "projects": [{
        "name": "My project name" //comes from input field
    }]
};

問題是:是否有一種簡單的方法可以通過路徑設置formattedObject中的值?

我的計划是通過“。”拆分路徑,循環遍歷它並在formattedObject內創建所需的層次結構。 但想知道是否有更好的方法呢?

您可以拆分路徑並檢查是否存在以下元素。 如果沒有檢查以下元素的數字並分配一個數組,否則為新屬性的對象。 然后返回屬性的值。

最后分配值。

 function setValue(object, path, value) { var fullPath = path.split('.'), way = fullPath.slice(), last = way.pop(); way.reduce(function (r, a, i, aa) { function isNumber(v) { return String(+v) === v; } return r[a] = r[a] || isNumber(fullPath[i + 1]) ? [] : {}; }, object)[last] = value; } var formattedObject = { id: "1" }, mapping = { name: "name", project: "projects.0.name" }; setValue(formattedObject, mapping.name, 'xyz'); setValue(formattedObject, mapping.project, 42); console.log(formattedObject); 

通過使用Object.prototype.setNestedValue()您可以動態設置深層嵌套對象的任何值。 您所需要的只是在參數中以正確的順序提供屬性名稱和數組索引。 最后一個參數是要設置的值。

讓我們來看看...

 Object.prototype.setNestedValue = function(...a) { a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1)) : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]), this[a[0]].setNestedValue(...a.slice(1))) : this[a[0]] = a[1]; return this; }; var formattedObject = { "id": "1", "name": "Object name", //comes from input field "projects": [{ "name": "My project name" //comes from input field }] }; console.log(JSON.stringify(formattedObject.setNestedValue("name","New Name"),null,4)); console.log(JSON.stringify(formattedObject.setNestedValue("projects",0,"name","New Project Name"),null,4)); 

您當然可以選擇將Object.prototype.setNestedValue()轉換為普通函數並相應地調整您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM