如何遍历对象数组并制作键值对?

Posted

技术标签:

【中文标题】如何遍历对象数组并制作键值对?【英文标题】:How to loop through array of objects and make key value pairs? 【发布时间】:2020-10-02 05:26:20 【问题描述】:

我有一个这样的对象数组:

let someObj = 
    items: [
        id: '12',
        value: true
    , 
        id: '34',
        value: true
    , 
        id: '56',
        value: false
    ]


我想将它添加到一个现有对象中,其中 id 是该对象的键,如下所示:

let obj = 
    someKey: someValue,
    '12': true,
    '34': true,
    '56': false,

【问题讨论】:

您遇到的具体问题是什么?你知道如何遍历数组吗?你知道如何访问对象的属性吗?你知道如何给对象添加属性吗? Convert object array to hash map, indexed by an attribute value of the Object的可能重复 【参考方案1】:

您可以使用Array#reduce 实现您的目标,如下所示:

const input = 
  items: [
    id: '12',
    value: true
  , 
    id: '34',
    value: true
  , 
    id: '56',
    value: false
  ]


const output = input.items.reduce((o, 
  id,
  value
) => (o[id] = value, o), )

console.log(output)

另外,也许最简单的方法是使用Array#map 将对象转换为pairs,然后使用Object.fromPairs 将它们转换为对象:

const input = 
  items: [
    id: '12',
    value: true
  , 
    id: '34',
    value: true
  , 
    id: '56',
    value: false
  ]


const output = Object.fromEntries(input.items.map((
  id,
  value
) => [id, value]))

console.log(output)

最后,这是一个函数式方法:

  // Composes two functions
  const compose = f => g => x => f (g (x))

  // Given the key-value pairs of some object with 2 properties, maps a pair of values
  const values = ([[, x], [, y]]) => [x, y]

  // Turns an object of two properties into a pair of property values
  const entry = compose (values) (Object.entries)

  // Turns many objects of two properties, into an object on which
  // keys are first properties' values, and vaules the second properties' values.
  const keyValueObject = xs => Object.fromEntries (xs.map (entry))

  const input = 
    items: [
      id: '12',
      value: true
    , 
      id: '34',
      value: true
    , 
      id: '56',
      value: false
    ]
  

  const output = keyValueObject (input.items)

  console.log(output)

【讨论】:

【参考方案2】:

您可以从 items 中迭代每个项目并创建一个新对象,如下所示。

let someObj = 
    items: [
        id: '12',
        value: true
    , 
        id: '34',
        value: true
    , 
        id: '56',
        value: false
    ]


const newObj = ;
someObj.items.map(item =>
newObj[item.id]= item.value;
);

console.log(newObj);

【讨论】:

【参考方案3】:

使用mapObject.values 会简化。

const output = arr => Object.fromEntries(arr.map(Object.values));

let someObj = 
  items: [
    
      id: "12",
      value: true,
    ,
    
      id: "34",
      value: true,
    ,
    
      id: "56",
      value: false,
    ,
  ],
;


console.log(output(someObj.items));

【讨论】:

嘿,很好的答案。它在概念上与我的第三次拍摄(功能性拍摄)***.com/a/62343622/411632 相似,但你的是最简单的。完美,除非项目有超过 2 个属性。在这种情况下,我的固定映射仍然可以工作。无论如何,您的答案应该是 OP 选择的答案。 谢谢@MatíasFidemraizer,同意你的看法。我喜欢你详细的概念和答案。【参考方案4】:

首先,您可以将itens转换为“KV”条目

> someObj.items.map((id, value) => [id, value])
[ [ '12', true ], [ '34', true ], [ '56', false ] ]

然后把它变成Object

> Object.fromEntries(someObj.items.map((id, value) => [id, value]))
 '12': true, '34': true, '56': false 

你可以做一个功能

> let ObjectFromMapping = (vs, mapping) => Object.fromEntries(vs.map(mapping))
> ObjectFromMapping(someObj.items, (id, value) => [id, value])
 '12': true, '34': true, '56': false 

也许将vs 变成一个可迭代对象是个好主意

> let ObjectFromMapping = (vs, mapping) => Object.fromEntries([... vs].map(mapping))
> ObjectFromMapping("abc", (char, idx) =>  [idx, char])
 '0': 'a', '1': 'b', '2': 'c' 

那么您的函数将适用于任何iterable

【讨论】:

以上是关于如何遍历对象数组并制作键值对?的主要内容,如果未能解决你的问题,请参考以下文章

遍历对象键值对的两种方法

循环遍历 JavaScript 对象数组并删除值

ES6对象的新增方法

遍历数组集合并返回命名键值对(Laravel/Eloquent)

PHP遍历键值对数组

map集合中的键值对对象遍历