如何制作具有有限值的对象数组

Posted

技术标签:

【中文标题】如何制作具有有限值的对象数组【英文标题】:How to make array of object with limmited values 【发布时间】:2022-01-01 05:27:09 【问题描述】:

对不起,如果标题不清楚,请提前说明,但很难用语言来描述。

我有什么:

const obj = 
 a: 5,
 b: 3,
 c: 0,
 d: 9

我想拥有什么:

const arr = [[a, 5] ,[b, 3]]

基本上,我尝试编写一个返回条目数组的函数,但它太符合要求:

当值等于 0 时不想要对象 值的总和必须小于 10

第一点对我来说很容易,我可以做到

Object.entries(obj).filter(([k, v])=> v !== 0)

但我无法处理第二个。

我可以在这里使用reduce 吗?

【问题讨论】:

有点不清楚:如果总和大于 10 会发生什么? 为什么不[['d', 9]] 如果你有f: 4 怎么办——那也可能产生[["a", 5], ["f", 4]][["b", 3], ["f", 4]]?以及如何选择正确的输出? 另外, a: 5, b: 9, c: 0, d: 3 的预期输出是什么 - 它是 [["a", 5], ["d", 3]][["a", 5]] 如果你有e: 1怎么办?它应该添加到结果集中吗? 【参考方案1】:

您可以使用closure 和IIFE 来存储总和

Object.entries(obj).filter((() => 
  let sum = 0;
  return ([k, v]) =>  sum += v; return v !== 0 && sum < 10; ; 
)());

示例:

function convert(obj) 
  return Object.entries(obj).filter((() => 
    let sum = 0;
    return ([k, v]) =>  sum += v; return v !== 0 && sum < 10; ; 
  )());


const obj =  a: 5, b: 3, c: 0, d: 9 ;
const arr = convert(obj);
console.log(arr);

const obj2 =  a: 0, b: 0, c: 8, d: 0, e: 1, f: 5 ;
const arr2 = convert(obj2);
console.log(arr2);

const obj3 =  a: 12 ;
const arr3 = convert(obj3);
console.log(arr3);

【讨论】:

【参考方案2】:

@jabaa's answer 很棒,你应该接受它。

为了确认你的直觉,你可以使用reduce,但它会变得相当复杂:

const obj = 
 a: 5,
 b: 3,
 c: 0,
 d: 9


const result = Object.entries(obj).reduce(
  (o, newPair) => 
     o.sum += newPair[1];
     newPair[1] !== 0 && o.sum < 10 && o.pairs.push(newPair);
     return o;
  ,
  
     sum: 0,
     pairs: []
  
).pairs;

console.log(result)

【讨论】:

确实,绝对!

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

如何检查包含另一个对象数组的对象数组是不是具有属性

多个对象数组

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

在循环中创建多个具有不同名称的对象以存储在数组列表中

如何从具有嵌套对象数组的对象数组中获取所有特定值?

如何使用处理 Java 库将自定义形状数组和字符串数组合并到 JSON 对象中