Javascript 检查数组的长度,并在其中推送或更新对象

Javascript 检查数组的长度,并在其中推送或更新对象,javascript,arrays,Javascript,Arrays,我真的在与我的代码斗争,无法找到一种方法使它工作 我需要检查数组是否存在或其长度是否为0,然后检查其中是否有具有特定值的对象。如果是,则更新它。如果没有,则添加它。请参阅下面我的代码: const originals = []; if (!originals || originals.length === 0) { originals.push({ "name": "Michael", "age": 21,

我真的在与我的代码斗争,无法找到一种方法使它工作

我需要检查数组是否存在或其长度是否为0,然后检查其中是否有具有特定值的对象。如果是,则更新它。如果没有,则添加它。请参阅下面我的代码:

const originals = [];

if (!originals || originals.length === 0) {
  originals.push({
    "name": "Michael",
    "age": 21,
    "gender": "male"
  });
} else {
  for (i = 0; i < originals.length; i++) {
    if (originals[i].name !== "Michael") {
      originals.push({
        "name": "Michael",
        "age": 21,
        "gender": "male"
      });
    }
    if (originals[i].name == "Michael" && originals[i].age == 21) {
      originals[i].age = 22;
    }
  }
  console.log(originals);
}
const-originals=[];
如果(!originals | | originals.length==0){
推({
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
});
}否则{
对于(i=0;i<0.length;i++){
如果(原件[i]。姓名!=“Michael”){
推({
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
});
}
如果(原件[i]。姓名==“Michael”&&originals[i]。年龄==21){
原件[i]。年龄=22岁;
}
}
控制台日志(原件);
}
非常感谢您的帮助。

使用
find()
方法查找具有所需名称的元素。如果找到了,则更新它,否则添加新元素

不需要检查数组的长度。如果数组为空,
find()
将找不到它

let mike = originals.find(({name}) => name == 'Michael');
if (mike) {
    if (mike.age == 21) {
        mike.age = 22;
    }
} else {
    originals.push({
        "name": "Michael",
        "age": 21,
        "gender": "male"
    });
}

此解决方案假定名称是唯一的。如果可以有多个
Michael
条目,您可以使用
filter()
而不是
find()
来返回所有条目。

下面是StackOverflow上令人惊叹的支持者的帮助下的简单解决方案。谢谢大家

const原件=[{
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
}];
如果(!originals | | originals.length==0){
推({
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
});
}否则{
对于(i=0;i<0.length;i++){
如果(原件[i].name!=“Michaels”){
推({
“姓名”:“迈克尔”,
“年龄”:22岁,
“性别”:“男性”
});
}
如果(原件[i]。姓名==“Michael”&&originals[i]。年龄==21){
原件[i]。年龄=24岁;
}
}
}

控制台日志(原件)在字里行间阅读我认为您要做的是:

  • 如果“Michael”在数组中。如果他22岁,那么他的年龄应该更新到21岁
  • 如果“Michael”不在数组中。再加上21岁的迈克尔
你的代码中有些奇怪的东西对我来说毫无意义。例如,每次迭代数组时,都要检查数组中的“Michael”。这意味着您为每个未命名为“Michael”的条目插入一个“Michael”。那没有道理,是吗

我想这就是你想要的:

函数addOrUpdateMichael(数组){
const michael=array.find((x)=>x.name==“michael”);
如果(!迈克尔){
array.push({
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
});
}否则如果(michael.age==22){
迈克尔:年龄=21岁;
}
返回数组;
}
常数testArray1=[];
console.log(addOrUpdateMichael(testArray1));
常数testArray2=[{
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
}, {
“姓名”:“托尼”,
“年龄”:18岁,
“性别”:“男性”
}];
console.log(addOrUpdateMichael(testArray2));
常数testArray3=[{
“姓名”:“迈克尔”,
“年龄”:22岁,
“性别”:“男性”
}, {
“姓名”:“鲍勃”,
“年龄”:36岁,
“性别”:“男性”
}];

console.log(addOrUpdateMichael(testArray3))以下是我对这个问题的快速解决方案:

在我看来,解决一个包含临时数据的新数组是个好主意

描述我的意思的最简单方法是在代码片段中

代码段(用于循环)
var originalstack=[];
函数PushToOriginalStack(){
对于(i=0;i<0.length;i++){
如果(原件[i].名称!=“Samantha”){
原始堆栈({
“姓名”:“迈克尔”,
“年龄”:21岁,
“性别”:“男性”
});
}
else if(原件[i]。姓名=“Samantha”&&originals[i]。年龄==20){
原件[i]。年龄=21岁;
原始堆栈推送(原始[i]);
}
控制台日志(i);
}
原件=原始堆栈;
}
PushToOriginalStack();
控制台日志(原件);
重要信息:将数据放在手边,以便处理原始阵列。
希望我能帮点忙!干杯

萨曼莎怎么了?该代码实际上与您的问题描述不符。似乎您试图在同一代码中执行不同的更新。也许你的问题只集中在一件事上……你的预期产出是什么?谢谢。让我简化数组。那么,年龄的逻辑是什么呢?所以你想把21岁的年龄加起来,然后检测出21岁,使之成为22岁?您的描述中没有提到此逻辑。在循环结束之前,您无法知道具有该名称的对象是否存在。您正在为每个不符合条件的元素推送新元素,而不仅仅是在数组中的任何位置。请清理缩进。除了将年龄设置为24而不是22之外,与原始代码有什么区别?如果未设置
originals
,则
originals.push()
将出现错误。这与旧代码的问题相同。它将为每个非Michaels条目添加一个新的Michaels条目。您要查找的名称是
Michael
还是
Michaels
?谢谢我的朋友为什么要使用
findIndex
而不是
find
?@Barmar好吧,结果没有什么区别,但我同意使用
find
使代码更可读。更新了答案。尼特:你可以把迈克变成一个常数用几行代码就可以非常简单有效地实现我的目标。谢谢你@barmar
var originalsStack=[];


function PushToOriginalStack() {

for (i=0; i < originals.length; i++) {
    if (originals[i].name != "Samantha") {
        originalsStack.push({
            "name": "Michael",
            "age": 21,
            "gender": "male"
        });

    }
    else if (originals[i].name == "Samantha" && originals[i].age == 20) {
        originals[i].age = 21;
        originalsStack.push(originals[i]);
    }


    console.log(i);
}

originals = originalsStack;
}

PushToOriginalStack();

console.log(originals);