如何在JavaScript中从其他数组向数组内的对象添加键值对

3

我有一个如下所示的数组 我试图通过替换数组内部对象中的null来添加一些值。 我想要添加的值来自不同的数组"y"

let toBesubmitted = [
        {a: null, id: "a"},
        {b: null, id: "b"},
        {c: null, id: "c"},
        {d: null, id: "d"},
        {e: null, id: "e"}
      ]

另一个数组

let y= ["apple", "ball", "cat", "dog", "elephant"]

我该如何实现这个目标?
6个回答

3
你可以通过在数组上使用forEach循环,并将一个值分配给y数组中特定索引处的item[item.id]属性来实现:

let toBesubmitted = [
        {a: null, id: "a"},
        {b: null, id: "b"},
        {c: null, id: "c"},
        {d: null, id: "d"},
        {e: null, id: "e"}
      ]

let y= ["apple", "ball", "cat", "dog", "elephant"]

toBesubmitted.forEach((item, index) => item[item.id] = y[index]||null);

console.log(toBesubmitted)


@ibrahimmahrir,请检查我的答案。 - AdityaParab
你的回答只有在原始问题提出者实际上根据另一个数组中单词的首字母创建对象数组时才有效,这有什么好处吗? - Luca Kiebel
@LucaKiebel:这是我们的假设。我的答案即使你改变数组中任意一个元素的顺序也是可行的。只要 y 中每个元素的第一个字母在 toBesubmitted 中有一个具有相同键的对象,这个方法就可以工作。 - AdityaParab
你可以使用 y[index] || null,就像 toBesubmitted.forEach((item, index) => item[item.id] = y[index] || null); 这样。这样,如果数组 y 的值比较少,它将再次分配 null 而不是 undefined - Karan
@Karan 是的,好主意;-) - Luca Kiebel
显示剩余6条评论

0
一个简单的循环就可以做到,如果toBeSubmitted [0] .a应该是y [0],而id属性告诉我们要设置哪个属性:

for (let i = 0; i < toBesubmitted.length; ++i) {
    toBesubmitted[i][toBesubmitted[i].id] = y[i];
}

例子:

let toBesubmitted = [
    {a: null, id: "a"},
    {b: null, id: "b"},
    {c: null, id: "c"},
    {d: null, id: "d"},
    {e: null, id: "e"}
];

let y = ["apple", "ball", "cat", "dog", "elephant"];

for (let i = 0; i < toBesubmitted.length; ++i) {
    toBesubmitted[i][toBesubmitted[i].id] = y[i];
}

console.log(toBesubmitted);


2
@ibrahimmahrir - 哇,我怎么会错过那个?已经修复了,谢谢!! - T.J. Crowder

0

虽然这不是最好的答案,但可以尝试一下:

    //print object
toBesubmitted.forEach(function(element, key){
    for(let e in element){
        if(e == Object.keys(element)[0])
            element[e] = y[key];
    }
});
Console.log(toBesubmitted);

-1
假设toBesubmitted[index][key]y[index][0],这个答案不依赖于索引以特定顺序出现。
let toBesubmitted = [
  { a: null, id: "a" },
  { b: null, id: "b" },
  { c: null, id: "c" },
  { d: null, id: "d" },
  { e: null, id: "e" }
];

let y= ["apple", "ball", "cat", "dog", "elephant"];

y.forEach( c => {
  const prop = toBesubmitted.find(tbs => tbs.id === c[0]);
  if(prop){
    prop[c[0]] = c;
  }
});

2
我相信那些只是 OP 给出的例子。y 可能是 [ "aaa", "aaaa", "aaaaaa", "bbbb", "dog" ],我认为它们不是基于第一个字符进行分配的。 - ibrahim mahrir

-1

你也可以像下面这样使用reduce函数;

let toBesubmitted = [
{a: null, id: "a"},
{b: null, id: "b"},
{c: null, id: "c"},
{d: null, id: "d"},
{e: null, id: "e"}
];

let y = ["apple", "ball", "cat", "dog", "elephant"];

toBesubmitted.reduce( (acc,curr,idx) => curr[curr.id] = y[idx], {} );

console.log(toBesubmitted);

但是你为什么要这样做呢?在这里使用reduce没有任何理由。 - Luca Kiebel
它具有更短的语法,使用高阶函数,利用JS的现有功能... - Reza
使用JS的现有功能将使用简单的循环。语法也不比使用循环的其他答案更短。 - Luca Kiebel
你也可以使用大多数其他箭头函数,但这并不需要一个答案。这些函数有它们的时间和地点,但它并不适用于这里。只是为了明确,我没有对你的答案进行投票。 - Luca Kiebel

-2

编辑过的

let toBesubmitted = [
    {a: null, id: "a"},
    {b: null, id: "b"},
    {c: null, id: "c"},
    {d: null, id: "d"},
    {e: null, id: "e"}
]

let y= ["apple", "ball", "cat", "dog", "elephant"]

toBesubmitted.forEach((item, index) => {
    Object.keys(item).forEach(key => {
        if (item[key] === null) {
            item[key] = y[index];
        }
    })
})

console.log(toBesubmitted);


1
null 属性并不总是 a - ibrahim mahrir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接