操作数组对象内的数据[重复]

Posted

技术标签:

【中文标题】操作数组对象内的数据[重复]【英文标题】:manipluate data inside an array object [duplicate] 【发布时间】:2019-07-15 00:44:47 【问题描述】:

我想遍历一个对象并对数据进行一些更改。如果我实际处理一个对象或包含多个对象的数组,我不是 100%,所以任何帮助表示赞赏。

这是我的对象:

var screening = 
    source: "jacket",
    value: 
        Cyan: 
            dotshape: "C",
            frequency: 120,
            angle: 67.5
        ,
        Magenta: 
            dotshape: "C",
            frequency: 120,
            angle: 37.5
        ,
        Yellow: 
            dotshape: "C",
            frequency: 120,
            angle: 82.5
        ,
        "PANTONE 3528 C": 
            dotshape: "C",
            frequency: 120,
            angle: 7.5
        ,
        "PANTONE 293 C": 
            dotshape: "C",
            frequency: 120,
            angle: 7.5
        ,
        "PANTONE 2748 C": 
            dotshape: "C",
            frequency: 120,
            angle: 7.5
        ,
        Varnish: 
            dotshape: "C",
            frequency: 120,
            angle: 0
        
    

在里面,我基本上想根据 2 个列表来查找和替换“键”(再次不确定术语)。

Old = [Cyan, Magenta, Yellow]
new = [changedName1, changedName2, changedName3]

理想情况下,我希望循环查看当前对象,如果它与数组 Old 中的某些内容匹配,则根据 New 重命名它。如果没有与数组 Old 中的某些内容匹配,则忽略它并保持原样。

提前致谢

【问题讨论】:

【参考方案1】:

使用delete删除旧属性,使用[](方括号表示法)和indexOf获取旧属性并创建新属性:

var screening = 
  source: "jacket",
  value: 
    Cyan: 
      dotshape: "C",
      frequency: 120,
      angle: 67.5
    ,
    Magenta: 
      dotshape: "C",
      frequency: 120,
      angle: 37.5
    ,
    Yellow: 
      dotshape: "C",
      frequency: 120,
      angle: 82.5
    ,
    "PANTONE 3528 C": 
      dotshape: "C",
      frequency: 120,
      angle: 7.5
    ,
    "PANTONE 293 C": 
      dotshape: "C",
      frequency: 120,
      angle: 7.5
    ,
    "PANTONE 2748 C": 
      dotshape: "C",
      frequency: 120,
      angle: 7.5
    ,
    Varnish: 
      dotshape: "C",
      frequency: 120,
      angle: 0
    
  
;

function oldToNew(oldNames, newNames) 
  Object.entries(screening.value).forEach(([key, prop]) => 
    if (oldNames.includes(key)) 
      screening.value[newNames[oldNames.indexOf(key)]] = screening.value[key];
      delete screening.value[key];
    
  );


oldToNew(["Cyan", "Magenta", "Yellow"], ["Blue", "Purple", "Orange"]);

console.log(screening.value);

注意:属性不会按顺序排列,因为如ECMAScript Specification所示:

ECMAScript objectproperties

unordered 集合

【讨论】:

嗨 JackThats 非常感谢。我对 JS 非常陌生,但一直在学习。我可以遵循 IF 语句,但我无法理解 Object.entries(screening.value).forEach(([key, prop]) 之前的那一行 .. 道具在做什么?当我运行代码时,我得到以下信息错误,即使它似乎在 1 个错误之上完美工作:6:ReferenceError: Invalid left-hand side in assignment 1 info (from 42 to 43): Object.entries(screening.value).forEach(([key, prop]) => 1 info ReferenceError: Invalid left-hand side in assignment 1 error Script Execution Error

以上是关于操作数组对象内的数据[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:查找值是不是在数组中的对象内的最佳方法[重复]

使用 mongoose 在 mongoDb 中更新数组内的对象 [重复]

如何从数组中删除重复值?当数组内的对象属性未定义时,我的代码失败

如何在CloudFirestore中更改数组中的对象? [重复]

Mongoose Schema中Array内的重复值

使用经度和纬度选择半径内的对象[重复]