निम्नलिखित प्रारूप के साथ एक वस्तु है:

let obj = {
  p2: {
    p21: [
      {
        key1: "val1",
        value1: "val2"
      },
      {
        prop: "test",
        value: "dummy"
      }
    ]
  }
}

मुझे मूल रूप से यह देखना है कि क्या कोई ऐसी वस्तु है जिसमें कुंजी "प्रोप" है और जो भी पारित मूल्य है उसे प्रतिस्थापित करें। यदि ऐसी कुंजी मौजूद नहीं है तो { "prop" : "test" , value: passed_value} के साथ एक ऑब्जेक्ट बनाएं और इसे p21 सरणी में जोड़ें। साथ ही कुंजी "प्रोप" वाली यह वस्तु p21 सरणी के अंदर कहीं भी मौजूद हो सकती है

कुछ ऐसा होना चाहिए

function checkAndUpdate(replacingValue) {
    if(obj's p21 has key name "prop")
    {
      //update its "value" to the passed "replacingValue"

    }
    else //if "prop" key not present
    {
       // create an object with { "prop": "test" , value: replacingValue} and add it to p21 array        
    }  
  }

निम्नलिखित कोशिश की है:

obj.p2.p21.map((elem) => {
    if(Object.keys(elem)[0] === "prop") 
        elem.value = updateValue;
})
0
joy08 27 जिंदा 2020, 10:13

2 जवाब

सबसे बढ़िया उत्तर

मिलान करने वाली वस्तु की अनुक्रमणिका खोजने के लिए .findIndex का प्रयोग करें। यदि यह मौजूद है, .slice पहले और बाद में सरणी, और बीच में, अद्यतन वस्तु डालें। अन्यथा, ऑब्जेक्ट को केवल सरणी में फैलाएं:

let obj = {
  "p2": {
    "p21": [{
        "key1": "val1",
        "value1": "val2",
      },
      {
        "prop": "test",
        "value": "dummy"
      }
    ]
  }
}

function checkAndUpdate(value) {
  const newObj = { prop: 'test', value} 
  const arr = obj.p2.p21;
  const index = arr.findIndex(obj => obj.hasOwnProperty('prop'));
  const newArr = index !== -1
    ? [...arr.slice(0, index), newObj, ...arr.slice(index + 1)]
    : [...arr, newObj];
  const fullNewObj = {
    ...obj,
    p2: {
      ...obj.p2,
      p21: newArr
    }
  };
  return fullNewObj;
}
console.log(checkAndUpdate('foo'));

यह भी जांचने के लिए कि क्या value अपरिभाषित है, और यदि ऐसा है तो मिलान करने वाली वस्तु को सरणी से हटा दें, बस उपयुक्त if चेक करें, और आवश्यकतानुसार सरणी को स्लाइस करें:

let obj = {
  "p2": {
    "p21": [{
        "key1": "val1",
        "value1": "val2",
      },
      {
        "prop": "test",
        "value": "dummy"
      }
    ]
  }
}

function checkAndUpdate(value) {
  const newObj = { prop: 'test', value} 
  const arr = obj.p2.p21;
  const index = arr.findIndex(obj => obj.hasOwnProperty('prop'));
  const newArr = (() => {
    if (index === -1) {
      if (value === undefined) {
        return arr;
      }
      return [...arr, newObj];
    }
    if (value === undefined) {
      return [...arr.slice(0, index), ...arr.slice(index + 1)];
    }
    return [...arr.slice(0, index), newObj, ...arr.slice(index + 1)];
  })();
  const fullNewObj = {
    ...obj,
    p2: {
      ...obj.p2,
      p21: newArr
    }
  };
  return fullNewObj;
}
console.log(checkAndUpdate('foo'));
1
CertainPerformance 28 जिंदा 2020, 08:55

आप उस वस्तु को खोजने के लिए Array.find का उपयोग कर सकते हैं जिसे hasOwnProperty prop और अपडेट किया गया है

let obj = {
  "p2": {
    "p21": [{
      "key1": "val1",
      "value1": "val2",
    },
    {
      "prop": "test",
      "value": "dummy"
    }
    ]
  }
}
function rep(value) {
  if (!value.length) {
    obj.p2.p21 = [...obj.p2.p21].filter(e => e.hasOwnProperty('prop'));
    return;
  }
  let ele = obj.p2.p21.find(e => e.hasOwnProperty('prop'));
  if (ele) {
    ele.value = value
    return;
  }
  obj.p2.p21.push({
    "prop": "test",
    value
  })
}

rep('test');
console.log(JSON.stringify(obj))
rep('');
console.log(JSON.stringify(obj))
1
AZ_ 27 जिंदा 2020, 18:52