查找对象键名并将对象添加到匹配数组

时间:2020-07-29 05:18:45

标签: javascript arrays loops object

我有这个数组:

const array = [
  {
    '12345': [
      { name: 'item one', numbers: ['12345', '77484'] },
      { name: 'item two', numbers: ['12345', '65456'] },
      { name: 'item three', numbers: ['12345', '33920'] },
      { name: 'item four', numbers: ['12345', '99393'] }
    ],
    '67890': [
      { name: 'item one b', numbers: ['67890', '33232'] },
      { name: 'item two b', numbers: ['67890', '33456'] },
      { name: 'item three b', numbers: ['67890', '77665'] },
      { name: 'item four b', numbers: ['67890', '11234'] }
    ]
  }
]

这个对象:

const newItem = { name: 'It is a new item', numbers: ['12345'] }

在数组中可以看到,它包含一个对象,该对象包含两个对象数组。每个嵌套数组的键都是一个数字,如您所见,键号也包含在每个项目的numbers数组中,例如:

{ name: 'item one', numbers: ['12345', '77484'] },

该键的数字数组中包含键'12345',因此'12345'是该对象的父级。

我想获取newItem的数字,将其与父键匹配,然后将其添加到与匹配键的父键对应的数组中。

请考虑到这是伪数据,并假设newItem中的numbers数组是动态值,并且嵌套的数组有很多值。这里的想法是使这两个数字匹配以知道应将newItem推送到何处。

4 个答案:

答案 0 :(得分:2)

尝试:

array.map((row) => {
  Object.keys(row).map((value) => {
    if (newItem.numbers.indexOf(value) >= 0) {
      row[value].push(newItem);
    }
  });
});

答案 1 :(得分:1)

您可以这样做:

    for (let i=0; i<array.length; i++) {
        array[i][newItem.numbers[0]] = array[i][newItem.numbers[0]] || [];
        array[i][newItem.numbers[0]].push(newItem);
    }

如果嵌套数组不存在,第一行将对其进行初始化。第二行将新项目推送到嵌套数组。

请参见下面的代码段。

const array = [
    {
        '12345': [
            { name: 'item one', numbers: ['12345', '77484'] },
            { name: 'item two', numbers: ['12345', '65456'] },
            { name: 'item three', numbers: ['12345', '33920'] },
            { name: 'item four', numbers: ['12345', '99393'] },
        ],
        '67890': [
            { name: 'item one b', numbers: ['67890', '33232'] },
            { name: 'item two b', numbers: ['67890', '33456'] },
            { name: 'item three b', numbers: ['67890', '77665'] },
            { name: 'item four b', numbers: ['67890', '11234'] },
        ],
    }
]


const newItem = {
    name: 'It is a new item',
    numbers: ['12345'],
}


for (let i=0; i<array.length; i++) {
    array[i][newItem.numbers[0]] = array[i][newItem.numbers[0]] || [];
    array[i][newItem.numbers[0]].push(newItem);
}

console.log(array); 

答案 2 :(得分:1)

借助解构。

const [obj] = array;
const {
  numbers: [key],
} = newItem;
obj[key].push(newItem);

const array = [
  {
    "12345": [
      {
        name: "item one",
        numbers: ["12345", "77484"],
      },
      {
        name: "item two",
        numbers: ["12345", "65456"],
      },
      {
        name: "item three",
        numbers: ["12345", "33920"],
      },
      {
        name: "item four",
        numbers: ["12345", "99393"],
      },
    ],
    "67890": [
      {
        name: "item one b",
        numbers: ["67890", "33232"],
      },
      {
        name: "item two b",
        numbers: ["67890", "33456"],
      },
      {
        name: "item three b",
        numbers: ["67890", "77665"],
      },
      {
        name: "item four b",
        numbers: ["67890", "11234"],
      },
    ],
  },
];

const newItem = {
  name: "It is a new item",
  numbers: ["12345"],
};

const [obj] = array;
const {
  numbers: [key],
} = newItem;
obj[key].push(newItem);

console.log(array);

答案 3 :(得分:0)

const array = [
  {
    '12345': [
      { name: 'item one', numbers: ['12345', '77484'] },
      { name: 'item two', numbers: ['12345', '65456'] },
      { name: 'item three', numbers: ['12345', '33920'] },
      { name: 'item four', numbers: ['12345', '99393'] }
    ],
    '67890': [
      { name: 'item one b', numbers: ['67890', '33232'] },
      { name: 'item two b', numbers: ['67890', '33456'] },
      { name: 'item three b', numbers: ['67890', '77665'] },
      { name: 'item four b', numbers: ['67890', '11234'] }
    ]
  }
]

const newItem = { name: 'It is a new item', numbers: ['12345'] }

newItem.numbers.forEach(n => array[0]?.[n].push(newItem));

console.log(array);