【问题标题】:JavaScript check Array and object matchJavaScript 检查数组和对象匹配
【发布时间】:2021-11-09 12:03:14
【问题描述】:

我有一个选定的商店对象数据。当我发出一个POST 请求作为返回时,我得到单个数据对象或数据数组,这取决于邮政编码。一个邮政编码有多个PickUp 点或单个PickUp 点。

我想根据POST请求返回数据创建一个Helper函数,如果它与我已经选择的商店对象数据不匹配,则返回true else return else。 我不知道如何创建不可预测的辅助函数,它可以是单个对象或具有多个对象的数组。

这是我的示例数据。我想和areaId比较数据

    const selectedArea = {
          areaId: "84ed84ad-81e3-49ed-absjsjjjs",
          name: "New york restaurant",

          address: {
            city: "New York",
            postalCode: "0012231",
            street: "New jersy"
          }
        };

        const newArea = [
          {
            areaId: "84ed84ad-81e3-49ed-absyay6w",

            name: "Veg retaurant",

            address: {
              city: "Calfornia",
              postalCode: "0018383",
              street: "Calfornia"
            }
          },
          {
            areaId: "84ed84ad-sjsjjs",

            name: "Indian restaurant",

            address: {
              city: "Calfornia",
              postalCode: "001aas8383",
              street: "Calfornia"
            }
          },
          {
            areaId: "84ed84ad-81e3-49sjsjjshq8q",

            name: "Desi restaurant",

            address: {
              city: "Calfornia",
              postalCode: "0011881",
              street: "Calfornia"
            }
          },
          {
            areaId: "84ed84ad-sjsjj-ssks-msms",

            name: "chinese restaurant",

            address: {
              city: "Calfornia",
              postalCode: "02992",
              street: "Calfornia"
            }
          }
        ];
        
        const newArea = 
          {
            areaId: "84ed84ad-81e3-49ed-absyay6w",

            name: "Veg retaurant",

            address: {
              city: "Calfornia",
              postalCode: "0018383",
              street: "Calfornia"
            }
          }
        ;

         const selectedAreaMatch = (selectedArea, newArea) => {
          console.log({ selectedArea });
          console.log({ newArea }); // it can be object or arrays

          // if does not match return true
          // if match return false
          return true;
        };

【问题讨论】:

  • 您可以在进行比较之前将单个对象转换为数组。但是,比较可能有点棘手。是否需要比较对象中的所有字段来判断它们是否相同?
  • areaId是对象的唯一标识,还是多个对象可以有相同的areaId

标签: javascript arrays object


【解决方案1】:

您可以通过使用[].concat 将参数转换为数组来克服差异。这种方法的好处是,不管参数是不是数组,都会得到相同的结果。

奇怪的是,当没有匹配的时候你期望true,却调用函数selectedAreaMatch。然后我将其称为selectedAreaIsNew,或者反转返回值,以便在匹配时为true。但是,我保留了您指定的名称和预期返回值:

const selectedAreaMatch = (selectedArea, newArea) => {
     // if does not match return true
     // if match return false
     return ![].concat(newArea).some(area => area.areaId === selectedArea.areaId);
};

const selectedArea = {areaId: "84ed84ad-81e3-49ed-absjsjjjs",name: "New york restaurant",address: {city: "New York",postalCode: "0012231",street: "New jersy"}};

const newArea = [{areaId: "84ed84ad-81e3-49ed-absyay6w",name: "Veg retaurant",address: {city: "Calfornia",postalCode: "0018383",street: "Calfornia"}},{areaId: "84ed84ad-sjsjjs",name: "Indian restaurant",address: {city: "Calfornia",postalCode: "001aas8383",street: "Calfornia"}},{areaId: "84ed84ad-81e3-49sjsjjshq8q",name: "Desi restaurant",address: {city: "Calfornia",postalCode: "0011881",street: "Calfornia"}},{areaId: "84ed84ad-sjsjj-ssks-msms",name: "chinese restaurant",address: {city: "Calfornia",postalCode: "02992",street: "Calfornia"}}];
        
const newArea2 ={areaId: "84ed84ad-81e3-49ed-absyay6w",name: "Veg retaurant",address: {city: "Calfornia",postalCode: "0018383",street: "Calfornia"}};

console.log(selectedAreaMatch(selectedArea, newArea));
console.log(selectedAreaMatch(selectedArea, newArea2));

【讨论】:

  • 非常感谢。你的回答很完美。
【解决方案2】:

首先,newArea 被声明了两次。如果您想通过 areaId 比较这两个区域,您可以在您的函数中执行以下操作:

   const selectedAreaMatch = (selectedArea, newArea) => {
    console.log({selectedArea});
    console.log({newArea}); // it can be object or arrays

    // if does not match return true
    // if match return false

    for (let i = 0; i < newArea.length; i++) {
        if (newArea[i].areaId === selectedArea.areaId) {
            return true;
        }
    }
    return false;
};

【讨论】:

  • newArea的样本数据。它可以是单个对象或数据数组。
  • 这个函数可以简化为:const selectedAreaMatch = (selectedArea, newArea) =&gt; newArea.some(a =&gt; a.areaId === selectedArea.areaId)
  • 如果它是一个对象或一个数组,你会做const selectedAreaMatch = (selectedArea, newArea) =&gt; [newArea].flat().some(a =&gt; a.areaId === selectedArea.areaId)
  • @CherryDT 我知道可以简化,但我喜欢坚持原始代码,所以请求者可以按照想法进行,但感谢您的建议。
  • @grisuu 对,抱歉,我错过了问题中已经有这样的代码。
【解决方案3】:

您可以将对象转换为具有单个元素的数组,然后进行比较:

const selectedAreaMatch = (selectedArea, newArea) => {
    const areas = Array.isArray(newArea) ? newArea : [newArea];

    // assumes that the area ids are unique
    return areas.some(area => area.areaId === selectedArea.areaId)
};

如果区域 ID 不是唯一的,则比较会稍微复杂一些。在这种情况下,您需要遍历对象的每个属性并与另一个属性进行比较。

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 1970-01-01
    • 2018-04-05
    • 2020-11-19
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    相关资源
    最近更新 更多