【问题标题】:Store first matched element in array for each in other array将数组中的第一个匹配元素存储在另一个数组中
【发布时间】:2020-04-03 18:22:30
【问题描述】:

我有一个包含地址的对象数组。我需要执行以下操作:

  • 从地址值中提取每个邮政编码。
  • 查找唯一的邮政编码并存储重复的数量。
  • 将每个唯一邮政编码的第一个地址与重复的数量一起存储在一个新数组中。

这是我当前的代码。

const json = [
  { "id": "10093729341", "address": "1 Alpha Road CF14 6AA" },
  { "id": "10024750520", "address": "2 Alpha Road CF14 6AA" },
  { "id": "10025738368", "address": "3 Alpha Road CF14 6AF" },
  { "id": "10025738368", "address": "4 Alpha Road CF14 6AF" },
  { "id": "10025738368", "address": "4 Alpha Road CF14 6AB" }
]

let allPostcodes = [];

json.forEach(address => {
  const fullAddresses = address.address;
  const postcodes = fullAddresses.split(",").map(s => s.trim().match(/([A-Za-z]{1,2}\d{1,2})(\s?(\d?\w{2}))?/)).filter(e => e)[0][0]
  allPostcodes.push(postcodes);
});

const uniquePostcodes = [...new Set(allPostcodes)];

uniquePostcodes.forEach(postcode => {
  const addresses = json.find(address => address.address.indexOf(postcode));
  console.log(addresses.address);
});

上面的最后部分在第一场比赛中停止,但仅适用于第一个邮政编码。我认为在一个循环中它会起作用,但它没有。

我想要的结果是这样的:

const array = [
  {
    "address": "1 Alpha Road CF14 6AA",
    "count": 2,
    "postcode": "CF14 6AA"
  },
  {
    "address": "3 Alpha Road CF14 6AF",
    "count": 2,
    "postcode": "CF14 6AF"

  },
  {
    "address": "4 Alpha Road CF14 6AB",
    "count": 1,
    "postcode": "CF14 6AB"

  }
]

【问题讨论】:

  • 你有想要的结果的例子吗?
  • 我已添加更新!谢谢

标签: javascript arrays


【解决方案1】:

您当前的解决方案不起作用的原因是以下行:

const addresses = json.find(address => address.address.indexOf(postcode));

如果找不到子字符串,则返回indexOf 结果,即-1-1 被认为是真实的,这反过来表明 find 找到了值。将此行更改为以下内容可修复您当前的代码。

const addresses = json.find(address => address.address.indexOf(postcode) >= 0);
// or
const addresses = json.find(address => address.address.includes(postcode));

如上所述,我个人会寻求不同的解决方案。

您可以通过首先根据邮政编码对地址进行分组来实现所需的输出。然后使用这些组构建您的输出数组。

const json = [
  { "id": "10093729341", "address": "1 Alpha Road CF14 6AA" },
  { "id": "10024750520", "address": "2 Alpha Road CF14 6AA" },
  { "id": "10025738368", "address": "3 Alpha Road CF14 6AF" },
  { "id": "10025738368", "address": "4 Alpha Road CF14 6AF" },
  { "id": "10025738368", "address": "4 Alpha Road CF14 6AB" }
];

// Group addresses by postcode.
const postcodeRegex = /([A-Za-z]{1,2}\d{1,2})(\s?(\d?\w{2}))?/;
const addressesByPostcode = new Map();

json.forEach(address => {
  const postcode = address.address.match(postcodeRegex);
  
  if (!addressesByPostcode.has(postcode[0]))
    addressesByPostcode.set(postcode[0], []);
  addressesByPostcode.get(postcode[0]).push(address);
});

// Build output array.
const array = Array.from(addressesByPostcode)
                   .map(([postcode, addresses]) => ({
                     address:  addresses[0].address,
                     count:    addresses.length,
                     postcode: postcode,
                   }));

// Display result.
console.log(array);

【讨论】:

    【解决方案2】:

    const 邮政编码 = fullAddresses.split(",")。 拆分方法将不起作用。您不应该在括号内使用逗号,因为您的地址值中没有逗号。改用空间。

    【讨论】:

      【解决方案3】:

      您可以改进查找邮政编码的功能,但其余保持不变。

      const json = [
                  {
                      "id": "10093729341",
                      "address": "1 Alpha Road CF14 6AA"
                  },
                  {
                      "id": "10024750520",
                      "address": "2 Alpha Road CF14 6AA"
                  },
                  {
                      "id": "10025738368",
                      "address": "3 Alpha Road CF14 6AF"
                  },
                  {
                      "id": "10025738368",
                      "address": "4 Alpha Road CF14 6AF"
                  },
                  {
                      "id": "10025738368",
                      "address": "4 Alpha Road CF14 6AB"
                  }
              ]
      
      
      /*
       * You can (and should) improve this later
       */
      const getPostCode = address => address.split(" ").slice(3, 5).join(" ");
      
      
      let r = json.reduce((res, o) => {
        // Find the post code 
        let postCode = getPostCode(o.address);
        // Find if the post code exists
        let pCodeExists = res.findIndex(add => add.postCode.indexOf(postCode) > -1);  
        // If the address exsits, increase the count
        if (pCodeExists > 0) {
          res[pCodeExists]['count']++; 
        // Otherwise, add a new entity
        } else {
          res.push({
            address: o.address,
            count: 1,
            postCode
          });
        }
        
        return res;
      
      }, []);
      
      console.log(r);

      【讨论】:

        【解决方案4】:

        也许它可以帮助你...... 3行。

        How to count duplicate value in an array in javascript

        var counts = {};
        your_array.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
        concole.log(counts);
        

        const json = [
                    {
                        "id": "10093729341",
                        "address": "1 Alpha Road CF14 6AA"
                    },
                    {
                        "id": "10024750520",
                        "address": "2 Alpha Road CF14 6AA"
                    },
                    {
                        "id": "10024750520",
                        "address": "2 Alpha Road CF14 6AA"
                    },
                    {
                        "id": "10025738368",
                        "address": "3 Alpha Road CF14 6AF"
                    },
                    {
                        "id": "10025738368",
                        "address": "4 Alpha Road CF14 6AF"
                    },
                    {
                        "id": "10025738368",
                        "address": "4 Alpha Road CF14 6AB"
                    }
                ]
        
        let allPostcodes = [];
        json.forEach(address => {
          const fullAddresses = address.address;
          const postcodes = fullAddresses.split(",").map(s => s.trim().match(/([A-Za-z]{1,2}\d{1,2})(\s?(\d?\w{2}))?/)).filter(e => e)[0][0]
          allPostcodes.push(postcodes);
        
        });
        
        
        var counts = {};
        allPostcodes.forEach(function(x) { counts[x] = (counts[x] || 0)+1; });
        console.log(counts);

        【讨论】:

          【解决方案5】:

          我认为find方法,需要find(address => address.address.indexOf(postcode) > -1(确保返回布尔值)


          更改了获取 pincodoe 的方式,假设它是拆分后的最后一个。 (你可以改变它,但主要问题可能在上面)

          const json = [
            {
              id: "10093729341",
              address: "1 Alpha Road CF14 6AA"
            },
            {
              id: "10024750520",
              address: "2 Alpha Road CF14 6AA"
            },
            {
              id: "10025738368",
              address: "3 Alpha Road CF14 6AF"
            },
            {
              id: "10025738368",
              address: "4 Alpha Road CF14 6AF"
            },
            {
              id: "10025738368",
              address: "4 Alpha Road CF14 6AB"
            }
          ];
          
          const codes = {};
          
          json.forEach(({ address }) => {
            const postcode = address
              .split(" ")
              .slice(-2)
              .join(" ");
            codes[postcode] =
              postcode in codes
                ? { ...codes[postcode], count: codes[postcode].count + 1 }
                : { address, count: 1, postcode };
          });
          
          console.log(Object.values(codes));

          【讨论】:

          • 谢谢。这很好用。我已经更新了我的代码以显示我需要的结果。
          • @MattSimon,很高兴听到。我刚刚更新了答案以获得所需的输出。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多