简体   繁体   中英

How to convert a single key value pair object to array of objects with key value pair?

I have a single object of key-value pair every key has an array as a value, How to convert it to an array of objects with key-value pair property by comparing it with another array of object.

var keys = [];

for (var k in obj) keys.push(k);

Input:

obj =  {
          "name": "jack",
          "age": 10,
          "country": "india",
          "state": "Delhi"
        }
        obj2 = [{key: "product", type:"", value:"", required:"true", mandatory:"true"},
        {key: "sub-product", type:"", value:"", required:"true", mandatory:"true"},
        {key: "name", type:"text", value:"", required:"true", mandatory:"true"},
        {key: "age", type:"text", value:"[0-9]", required:"true", mandatory:"true"},
        {key: "country", type:"text", value:"[a-z]", required:"true", mandatory:"true"},
        {key: "state", type:"text", value:"[a-z]", required:"true", mandatory:"true"}]

Expected output:

result = [{key: "name", type:"text", value:"", required:"true", mandatory:"true",setValue:"jack"},
        {key: "age", type:"text", value:"[0-9]", required:"true", mandatory:"true",setValue:"10"},
        {key: "country", type:"text", value:"[a-z]", required:"true", mandatory:"true",setValue:"india"},
        {key: "state", type:"text", value:"[a-z]", required:"true", mandatory:"true",setValue:"Delhi"}];

You can filter it first using hasOwnProperty and then map it to set setValue property. Here is implementation:

 var obj = { "name": "jack", "age": 10, "country": "india", "state": "Delhi" }; var obj2 =[{key: "product", type:"", value:"", required:"true", mandatory:"true"}, {key: "sub-product", type:"", value:"", required:"true", mandatory:"true"}, {key: "name", type:"text", value:"", required:"true", mandatory:"true"}, {key: "age", type:"text", value:"[0-9]", required:"true", mandatory:"true"}, {key: "country", type:"text", value:"[az]", required:"true", mandatory:"true"}, {key: "state", type:"text", value:"[az]", required:"true", mandatory:"true"}]; var result = obj2.filter(k=>obj.hasOwnProperty(k.key)).map(p=>({...p, setValue:obj[p.key]})); console.log(result);

Loop over obj2 . If the key value is a property of obj , copy the corresponding value into the setValue property of the object, and push it onto the result.

 obj = { "name": "jack", "age": 10, "country": "india", "state": "Delhi" }; obj2 = [{key: "product", type="", value="", required="true", mandatory="true"}, {key: "sub-product", type="", value="", required="true", mandatory="true"}, {key: "name", type="text", value="", required="true", mandatory="true"}, {key: "age", type="text", value="[0-9]", required="true", mandatory="true"}, {key: "country", type="text", value="[az]", required="true", mandatory="true"}, {key: "state", type="text", value="[az]", required="true", mandatory="true"}]; var result = []; obj2.forEach(o => { if (o.key in obj) { o.setValue = obj[o.key]; result.push(o); } }); console.log(result);

You can use Array.prototype.flatmap to achieve this

 const obj = { "name": "jack", "age": 10, "country": "india", "state": "Delhi" } const obj2 = [ {key: "product", type:"", value:"", required:"true", mandatory:"true"}, {key: "sub-product", type:"", value:"", required:"true", mandatory:"true"}, {key: "name", type:"text", value:"", required:"true", mandatory:"true"}, {key: "age", type:"text", value:"[0-9]", required:"true", mandatory:"true"}, {key: "country", type:"text", value:"[az]", required:"true", mandatory:"true"}, {key: "state", type:"text", value:"[az]", required:"true", mandatory:"true"} ] const result = obj2.flatMap((entry) => { if (obj[entry.key]) { return { ...entry, setValue: obj[entry.key], } } return [] }) console.log(result)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM