我需要能够在运行时合并两个(非常简单的)JavaScript对象.例如,我想:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 now has three properties: food, car, and animal
Run Code Online (Sandbox Code Playgroud)
有没有人有这个脚本或知道内置的方法来做到这一点?我不需要递归,我不需要合并函数,只需要平面对象上的方法.
我希望Sanctuary能够提供与Fantasy Land兼容的Map和Set类型以及基于值的等式语义.理想情况下,这些值是不可变的,尽管这并不重要,因为Sanctuary将提供用于合并和操纵这些值的纯函数.
我很乐意利用Immutable.js团队所做的出色工作; 我想实现持久数据结构需要相当大的努力!
由于Sanctuary会公开与这些值交互的函数,因此Immutable.js提供的API并不重要.但是,这些类型的等同语义至关重要.
这对我的用例来说是不可接受的:
> Map([[[1, 2, 3], 'foo'], [[1, 2, 3], 'bar']])
Map { [1,2,3]: "foo", [1,2,3]: "bar" }
Run Code Online (Sandbox Code Playgroud)
[1, 2, 3]是一样的价值[1, 2, 3].不应该有两个具有相同键的映射条目.
处理-0也存在问题:
> Immutable.is(Map([[0, 0]]), Map([[-0, -0]]))
true
Run Code Online (Sandbox Code Playgroud)
我意识到可以通过定义equals方法来定义自己类型的相等语义,但我希望重新定义本机类型(如Array和Number)的相等语义.这可能吗?相关文件似乎是is.js,但我看不到自定义的钩子.
Sanctuary的Map类型可能会包装Immutable.js Map类型.这将提供:
-0;assoc通常会导致重复键的操作之前执行基于值的相等性检查的机会; 和fantasy-land/方法的地方.也许:
Map k v = { negativeZero :: Maybe v
, value :: ImmutableMap k v …Run Code Online (Sandbox Code Playgroud) 我有一个包含下划线(_)变量名的数据集。如下图:
const data = {
m_name: 'my name',
m_address: 'my address',
p_1_category: 'cat 1',
p_1_name: 'name 1',
p_2_category: 'cat 2',
p_2_name: 'name 2'
}
Run Code Online (Sandbox Code Playgroud)
我想将它们拆分为嵌套对象/数组,下面是我想要的结果。
{
m: {
name: "my name",
address: "my address"
},
p: {
"1": {category: 'cat 1', name: 'name 1'},
"2": {category: 'cat 2', name: 'name 2'}
}
}
Run Code Online (Sandbox Code Playgroud)
如何编写递归方法来实现它而不是硬编码?也许它应该允许处理更深的嵌套对象,例如 "p_2_one_two_category: 'value'" 到 p:{2:{one:{two:category:'value'}}}
const data = {
m_name: 'my name',
m_address: 'my address',
p_1_category: 'cat 1',
p_1_name: 'name 1',
p_2_category: 'cat 2',
p_2_name: 'name 2' …Run Code Online (Sandbox Code Playgroud)我试图找到一个同等功能的Lodash的合并使用Ramda,做一个递归对象键为基础的"合并"或"扩展".行为类似于以下内容:
let merged = R.someMethod(
{ name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }},
{ address: { street: 'Pine', number: 33 }}
);
console.log(merged);
// => { name: 'Matt', address: { street: 'Pine', number: 33, suffix: 'Ave' }}
Run Code Online (Sandbox Code Playgroud)
我在下面简要介绍的pull请求中注意到R.set了,但之后很快就回滚了.从那以后,Ramda库是否已捕获此功能?
Ramda有这个功能吗?
客观的:
我需要检查表单是否已被用户编辑。如果是,那么我将调用axios.put()函数。
问题:
由于在 JS 中, obj1 = { name: "John "} !== obj2 = { name: "John" } 我正在寻找一种更好的方法来比较两个对象。
我的方式(似乎效率低下):
const intialAddress= {
city: "CA"
line1: "testline1"
line2: "testline2"
phone: "7772815615"
pin: "1234"
state: "CA"
}
const [address, setAddress] = useState(initialAddress);
let addressFinalValue = {};
const addressValue = (e) => {
addressFinalValue[e.target.name] = e.target.value;
};
/***************************
* The way I am doing it
**************************/
const submitHandler = (e) => {
e.preventDefault();
setAddress(addressFinalValue);
if ( address.line1 !== initialAddress.line1 …Run Code Online (Sandbox Code Playgroud) 我想比较两个对象,并想制作一个具有共同属性的新对象。我已经看到很多解决方案来采取差异,但不确定我们如何才能采取共同的价值观。
这是我的对象,如果 obj1 的 iscommisionAccount false 和 obj2 的 iscommisionAccount true 则我的结果不应该有值,因为如果两者具有相同的属性,则结果不匹配,则只会得到结果。
我知道如果我们有对象数组我们可以使用过滤器但是如果我们只有对象怎么办。
obj 1 = {
"val1":"test",
"stream":{
"iscommisonAccount":false,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"iscommisonAccount":true,
"istradeAccount":true
}
}
result = {
"stream":{
"istradeAccount":true
}
}
diffrent examples:
obj 1 = {
"val1":"test",
"stream":{
"iscommisonAccount":false,
"istradeAccount":true
}
}
obj 2 = {
"val1":"test",
"stream":{
"iscommisonAccount":true,
"istradeAccount":false
}
}
result = {
"stream":{
}
}
or
obj 1 = {
"val1":"test",
"stream":{
"iscommisonAccount":true,
"istradeAccount":true
}
}
obj …Run Code Online (Sandbox Code Playgroud)javascript ×6
arrays ×2
object ×2
immutable.js ×1
ramda.js ×1
react-native ×1
react-redux ×1
reactjs ×1
recursion ×1
sanctuary ×1
typescript ×1