如何合并到对象并将空值替换为新值,如果新值为空则保留旧值

问题描述 投票:0回答:1

我每次选择一个值时都有一个对象数组,我将其推入数组中,我想合并具有相同键(即键“code”)的两个对象,并删除空值

(4) [{…}, {…}, {…}, {…}]
0: {code: "abc", value: "", access: "A"}
1: {code: "abc", value: "ok", access: ""}
2: {code: "def", value: "xyz", access: ""}
3: {code: "def", value: "", access: "B"}

the output should be
(2) [{…},{…}]
0: { code: "abc", value: "ok", access: "A"}
1: {code: "def", value: "xyz", access: "B"}

我尝试过使用展开运算符,但它不起作用。请帮帮我

javascript javascript-objects
1个回答
1
投票

您可以使用 .reduce(..) 这是一个示例:

const input = [
  {code: "abc", value: "", access: "A"},
  {code: "abc", value: "ok", access: ""},
  {code: "def", value: "xyz", access: ""},
  {code: "def", value: "", access: "B"}
];

const output = input.reduce((a, c) => {
  const found = a.find(({ code }) => c.code === code);
  if (found) {
    Object.entries(c).forEach(([key, value]) => {
      if (!found[key]) {
        found[key] = value;
      }
    });
  } else {
    a.push(c);
  }
  return a;
}, []);

console.log(output);

即使这对于示例输入正确有效,但在某些情况下也会失败,因为它替换了所有 falsy 值(布尔值

false
数字
0
等),这可能不是您的意图。

为防止出现这种情况,请将

!found[key]
语句中的
if
条件替换为适合您需要的任何检查。

© www.soinside.com 2019 - 2024. All rights reserved.