Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有非空值的唯一键_Javascript_Arrays_Object - Fatal编程技术网

Javascript 具有非空值的唯一键

Javascript 具有非空值的唯一键,javascript,arrays,object,Javascript,Arrays,Object,我有一个这样的数组: const es = [ ['A', 'A1'], // first A key ['B', null], ['C', null], ['A', null], // second A key ['B', null], ['C', null], ['D', 'D2'] ] 我想要的是: const res = { A: 'A1', B: null, C: null, D: 'D2' } 因此,我想要一个具有唯一键的对象,其中如果

我有一个这样的数组:

const es = [
  ['A', 'A1'], // first A key
  ['B', null],
  ['C', null],
  ['A', null], // second A key
  ['B', null],
  ['C', null],
  ['D', 'D2']
]
我想要的是:

const res = {
  A: 'A1',
  B: null,
  C: null,
  D: 'D2'
}
因此,我想要一个具有唯一键的对象,其中如果存在具有不同值的重复键(如
A
B
C
),则键的值为非空值

要获得
res
,我可以执行以下操作:

const res = Object.fromEntries(flatten(es))
但在这种情况下,
res
是:

res = {
    A: null,
    B: null,
    C: null
  }
我认为这是因为
Object.fromEntries
“创建了一个
set
,第二个
a
键替换了第一个键。

那么,哪种方法是我想要的最好方法呢?

我只需要使用一个循环,检查对象是否没有属性,或者是否有属性,但值为
null

const obj = {};
for (const [key, value] of es) {
    if (!(key in obj) || obj[key] === null) {
        obj[key] = value;
    }
}
实例:

常数=[
['A','A1'],//首先是一个键
[B',null],
[C',null],
['A',null],//第二个密钥
[B',null],
[C',null],
['D','D2']
];
常量obj={};
for(es的常数[键,值]){
如果(!(输入对象)| |对象[键]==null){
obj[键]=值;
}
}

控制台日志(obj)
您可以使用一个简单的
forEach
循环来迭代内部数组,并更新现有对象属性(如果它们仍然为
null
),但有一个新值:

常数=[
['A','A1'],//首先是一个键
[B',null],
[C',null],
['A',null],//第二个密钥
[B',null],
[C',null],
['D','D2']
]
设obj={};
es.forEach(arr=>{
//检查对象键是否不存在;或者是否具有空值,并且是否可以使用非空值进行更新
if(!obj.hasOwnProperty(arr[0])| |(obj[arr[0]]==null&&arr[1]!==null)){
obj[arr[0]]=arr[1];
}
});

控制台信息(obj)您可以尝试以下方法:

只有在以下情况下,才需要设置新值:

  • 值为空
    null
    未定义
  • 这两个值都存在且有效
其思想是分配第一个值,并用最新的非空值替换

常数=[
['A','A1'],//首先是一个键
[B',null],
[C',null],
['A',null],//第二个密钥
[B',null],
[C',null],
['D','D2']
]
const result=es.reduce((acc[key,value])=>{
如果(acc[键]==null | |!!acc[键]&&!!值)acc[键]=值;
返回acc
}, {});
console.log(结果)
使用

常数=[
['A','A1'],
[B',null],
[C',null],
[A',null],
[B',null],
[C',null],
['D','D2']
]
const reduced=es.reduce((累加器,当前项)=>{
常量[键,值]=当前项
累加器[键]=累加器[键]|值
回流蓄能器
}, {})

console.log(reduced)
我认为您应该使用map和set的组合。这是区别于一系列对象的最简单方法

var-es=[
['A','A1'],//首先是一个键
[B',null],
[C',null],
['A',null],//第二个密钥
[B',null],
[C',null],
['D','D2']
]
var obj={};
var dist=[…新集合(es.map)(函数(x){
如果(!obj[x[0]])
obj[x[0]]=x[1];
返回obj;
}))][0]

控制台日志(dist)什么是“展平”
?如果存在两个值都不为空的重复键,该怎么办?先走,后走,还是不走?